gpt4 book ai didi

javascript - Node.js 通过 ID 从 mongoDB 中查找结果

转载 作者:可可西里 更新时间:2023-11-01 09:13:34 26 4
gpt4 key购买 nike

我是 Node.js 的新手,如果这是一个非常愚蠢的问题,我很抱歉,但是我尝试了我找不到答案。

我有一些简单的代码:

var express = require("express");
var mongoose = require("mongoose");
var cors = require("cors");

mongoose.connect('mongodb://localhost/simple')

var personSchema = {
firstName:String,
lastName:String,
email:String
}

var Person = mongoose.model('Person', personSchema, 'people')

var app = express();
app.use(cors());

app.get('/people', function (req, res) {
Person.find(function (err, doc) {
res.send(doc);
})
})

app.get('/people/:id', function (req, res) {
Person.findById(req.params.id, function (err, doc) {
res.send(doc);
})
})
app.listen(3000);

这应该会返回我插入到 mongo DB 的一些数据,而第一个/people/会正确返回所有数据(基本上只是返回 DB 的转储)

第二个 ID 不返回任何内容。我尝试调试它,发现函数 ID 的内部定义正确,我还使用了来自“people”站点的 ID(类似于:55e028081181bfdd8a7972d2),尽管这个事实我无法得到任何答案或错误。

有没有人可以告诉我哪里可能有问题?

最佳答案

是时候揭穿这个问题了,因为我自己已经厌倦了这里的错误回答。

作为一个单元的代码很好。唯一可能发生的问题是您发送了错误的内容或处理了错误的集合,以及关于 _id 值本身的最后一个问题。

正如我的 list 所证明的那样,除了“原始”express 和 mongoose 之外,您不需要任何其他东西:

var async = require('async'),
express = require('express'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/simple');

var personSchema = new Schema({
firstName: String,
lastName: String,
email: String
});

var Person = mongoose.model( 'Person', personSchema );

var app = express();

mongoose.connection.on('open',function(err) {

async.series(
[
function(callback) {
Person.remove({},callback);
},
function(callback) {
Person.create({
firstName: "John",
lastName: "Doe",
email: "john.doe@example.com"
},callback);
}
],
function(err,results) {
if (err) throw err;
console.log(
"Created and call in URL: %s",
results[1]._id
);

// setup routes

app.get('/people', function(req,res) {
Person.find(function(err,docs) {
res.send(docs)
});
});

app.get('/people/:id', function(req,res) {
Person.findById(req.params.id,function(err,doc) {
res.send(doc);
});
});

app.listen(3000);
console.log("ready");

}
);

});

输出如下:

Created and call in URL: 55e0464e66e13f6506e8e38e
ready

因此,当您在 /people url 上调用服务器时,您会得到:

[
{
"_id":"55e0464e66e13f6506e8e38e",
"firstName":"John",
"lastName":"Doe",
"email":"john.doe@example.com",
"__v":0
}
]

作为回应。

当你使用 /people/55e0464e66e13f6506e8e38e 中的 id 调用时,你会得到:

{
"_id":"55e0464e66e13f6506e8e38e",
"firstName":"John",
"lastName":"Doe",
"email":"john.doe@example.com",
"__v":0
}

正如预期的那样。

因此,如果您的应用程序无法正常工作,那么您要么没有发送您认为的内容,要么您实际上在集合中有一个用于 _id 值的字符串,或者它完全不匹配集合或数据库名称。所有网址都应该有效,如果没有一个有效,则属于后者。

_id 是字符串的情况下,架构是错误的,需要:

var personSchema = new Schema({
_id: String
firstName: String,
lastName: String,
email: String
},{ "_id": false });

最重要的是,除了为架构中的 _id 字段设置正确的类型外,还有 { "_id": false }

这是因为您需要它来告诉 mongoose 不要尝试将“字符串”解析为 ObjectId,因为它在默认情况下总是这样做。

如果没有这个设置,“字符串”将永远失败。

但是这个 list 是什么有效的证明,也是如果 _id 实际上包含“字符串”或其他类型时真正需要的唯一更改。因此,如果 Number 则同时为 _id: Number{ "_id": false } 设置架构,否则会出现相同的失败原因。


为了纯粹的愚蠢,然后将我的列表更改为:

var personSchema = new Schema({
_id: { type: String, default: "55e0464e66e13f6506e8e38e" },
firstName: String,
lastName: String,
email: String
},{ "_id": false });

并且每次都观察它的工作情况。

同时请删除 { "_id": false } 并观察它是否失败,以便清楚为什么在 _id 类型要被覆盖时需要这样做.

关于javascript - Node.js 通过 ID 从 mongoDB 中查找结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32267937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com