gpt4 book ai didi

node.js - 在 mongo 中按 id 或用户名查找

转载 作者:可可西里 更新时间:2023-11-01 09:59:04 27 4
gpt4 key购买 nike

我正在尝试通过用户名或 _id 像这样进行查找

exports.getUser = function (req, res){
User.find({ $or: [ {username:req.params.id}, {_id:req.params.id} ] })
.exec(function (err, collections) {
res.send(collections);
});
};

当我按 _id 搜索但搜索用户名失败时它有效,因为它无法返回有效的 OjectID。我试过像这样做两个单独的查询

exports.getUser = function (req, res){
User.findOne({username:req.params.id}).exec(function (err, user) {
if (user)
res.send(user);
});

User.findById({_id:req.params.id}).exec(function (err, user) {
if (user)
res.send(user);
});
};

但是如果用户不存在就会挂起,因为它从不发送响应。由于 Node 是异步的,我得到 Error: Can't set headers after they are sent. 如果我添加

else
res.sendStatus(400);

到 findById 查询。我想不出任何其他方法来解决这个问题。我在 MongoDB Node check if objectid is valid 中尝试了正则表达式

exports.getUser = function (req, res){
var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$");
if(checkForHexRegExp.test(req.params.id)){
User.findById({_id:req.params.id}).exec(function (err, user) {
if (user)
res.send(user);
});
}
User.findOne({username:req.params.id}).exec(function (err, user) {
res.send(user);
});

};

我遇到了同样的错误,因为它是异步的。必须有比这更好的方法

最佳答案

您的第一个查询很可能不会工作,因为 MongoDB 期望 _id 是一个 ObjectId,而不是一个字符串(req.params.id 可能是) :

var ObjectId = require('mongoose').Types.ObjectId;

exports.getUser = function (req, res) {
var id = req.params.id;
var $or = [ { username : id } ];

// Does it look like an ObjectId? If so, convert it to one and
// add it to the list of OR operands.
if (ObjectId.isValid(id)) {
$or.push({ _id : ObjectId(id) });
}

User.find({ $or : $or }).exec(function (err, collections) {
// TODO: check for errors
res.send(collections);
});
};

关于node.js - 在 mongo 中按 id 或用户名查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30651875/

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