我正在用mongodb构建一个fastify应用程序,我创建了这个package.json文件,其中包含运行mongo的脚本。
{
"dependencies": {
"@fastify/mongodb": "5.0.0",
"fastify": "4.11.0"
},
"scripts": {
"start": "node server.js",
"start-mongo": "docker run -d --name my-mongo -p 27017:27017 mongo",
}
}
使用npm run start-mongo
,我运行mongo暴露端口27017。然后,...这是fastify部分。
const fastify = require('fastify')({logger: true})
fastify.register(require('@fastify/mongodb'), {
forceClose: true,
url: 'mongodb://localhost:27017/library'
})
fastify.get('/books', async(request, reply) => {
const books = await fastify.mongo.db
.collection('books')
.find()
reply.send(books)
});
fastify.post('/books', async(request, reply) => {
const result = await fastify
.mongo.db
.collection('books')
.insertOne(request.body)
reply.send({
message: 'book added',
id: result.insertId
})
})
GET/书籍:
{"_events":{},"_eventsCount":0}
邮政/书籍
curl -H 'Content-Type: application/json' -X POST http://localhost:3000/books -d '{"message":"prova"}'
退货
{"message":"book added"}
这很奇怪,因为响应应该也包含id,但它没有。
reply.send({
message: 'book added',
id: result.insertId
})
这意味着
const result = await fastify
.mongo.db
.collection('books')
.insertOne(request.body)
不存储图书。显示任何错误,GET始终返回:
{"_events":{},"_eventsCount":0}
怎么啦?
我还用docker-compose创建了mongo:
version: '3.1'
services:
mongo:
image: mongo
restart: always
ports:
- 27017:27017
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
但它返回:
{
statusCode: 500,
code: '13',
error: 'Internal Server Error',
message: 'command insert requires authentication'
}
{
statusCode: 500,
code: '13',
error: 'Internal Server Error',
message: 'command find requires authentication'
}
我从更新了代码
fastify.register(require('@fastify/mongodb'), {
forceClose: true,
url: 'mongodb://localhost:27017/library'
})
到
fastify.register(require('@fastify/mongodb'), {
forceClose: true,
url: 'mongodb://root:example@localhost:27017/library'
})
但返回:
(node:86146) UnhandledPromiseRejectionWarning: MongoServerError: Authentication failed.
at Connection.onMessage (/Users/simonegentili/Development/github.com/sensorario/youtube.poliglotta/node_modules/mongodb/lib/cmap/connection.js:227:30)
at MessageStream.<anonymous> (/Users/simonegentili/Development/github.com/sensorario/youtube.poliglotta/node_modules/mongodb/lib/cmap/connection.js:60:60)
at MessageStream.emit (events.js:375:28)
at processIncomingData (/Users/simonegentili/Development/github.com/sensorario/youtube.poliglotta/node_modules/mongodb/lib/cmap/message_stream.js:125:16)
at MessageStream._write (/Users/simonegentili/Development/github.com/sensorario/youtube.poliglotta/node_modules/mongodb/lib/cmap/message_stream.js:33:9)
at writeOrBuffer (internal/streams/writable.js:358:12)
at MessageStream.Writable.write (internal/streams/writable.js:303:10)
at Socket.ondata (internal/streams/readable.js:726:22)
at Socket.emit (events.js:375:28)
at addChunk (internal/streams/readable.js:290:12)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:86146) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:86146) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
为什么"认证失败"?
1条答案
按热度按时间t98cgbkg1#
您需要:
1.更新fastify mongo to v6以支持fastify v4
fastify.mongo.db.collection('books').find().toArray()
1.要恢复插入的ID,您需要从
inserted
更改为insertedId
1.要设置MongoDB密码duplicated question,或者需要设置
database
属性-更新了以下代码:fastify.mongo.db.collection
的用法快速和肮脏的复制粘贴: