Node.js 节点/快速函数和回调未因返回而中断
我正在节点中创建一个“刷新数据”函数,无法确定回调和返回的位置。该函数将继续运行。下面是函数应该做的事情的列表。有人能帮忙吗Node.js 节点/快速函数和回调未因返回而中断,node.js,mongodb,rest,express,mongoose,Node.js,Mongodb,Rest,Express,Mongoose,我正在节点中创建一个“刷新数据”函数,无法确定回调和返回的位置。该函数将继续运行。下面是函数应该做的事情的列表。有人能帮忙吗 检查用户在本地MongoDB中是否具有api id 使用POST调用REST api以接收令牌 将令牌存储在MongoDB中 终止函数 ./routes/index.js router.post('/refresh', function(req, res) { var refresh = require('../api/refresh'); refresh
router.post('/refresh', function(req, res) {
var refresh = require('../api/refresh');
refresh(req, function() { return console.log('Done'); });
});
../api/refresh.js
var callToken = require('./calltoken');
var User = require('../models/user'); // Mongoose Schema
module.exports = function(req, callback) {
User.findOne( {'username':req.body.username}, function(err, user) {
if(err) { console.log(err) }
if (user.api_id == 0) {
callToken.postToken(req.body.username, callback);
} else { // Do something else }
});
};
/calltoken.js
var request = require('request');
var Token = require('../models/token'); // Mongoose Schema
module.exports = {
postToken: function(user, callback) {
var send = {method:'POST', url:'address', formData:{name:user} };
request(send, function(err, res, body) {
if(err) { console.log(err) }
if (res.statusCode == 201) {
var newToken = new Token();
newToken.token = JSON.parse(body).access_token['token'];
newToken.save(function(err) {
if(err) { console.log(err) }
return callback();
});
}
});
}
};
我不是Express方面的专家,但在您的任何地方,代码都与
if(err){console.log(err)}
保持一致,您应该停止执行(当然可能不取决于您的应用程序),并将400或500返回给客户端。所以它可以是这样的
if(err) {
console.log(err);
return callback(err); // NOTICE return here
}
成功执行后,应调用
返回回调(null,result)
。请注意,第一个参数为null-这符合nodejs约定(错误总是作为第一个参数出现)。因此,如果res.statusCode
不是预期的结果,何时调用回调并允许继续执行?另外,使用request()
调用在作用域中过度加载res
也是一种不好的做法。res
和req
都是端点请求的计分变量,即使您现在正在“测试”,您也会希望使用该范围内的res
向客户端返回“响应”。Blakes,感谢您的快速响应。我删除了res.statusCode的else语句!=201以简化过帐,但如果出现这种情况,将返回一个错误,并停止函数,不再进行回调。我希望刷新数据和错误检查的过程在使用多个分支完成后,每个步骤都会非常长。此外,我将确保避免覆盖res,并将使用res和req仅用于与客户端通信。感谢您的帮助。Blakes,该问题已通过async.series解决。为了简化,我将代码整合到路由中的./routes/index.js文件中。谢谢你早些时候的帮助和建议。谢尔盖,非常感谢。我已将此特定路由更改为使用async.series。也就是说,您的回答帮助我理解了如何恰当地使用return和callback。尽管我阅读和回顾了许多例子,但我还是很难理解这个话题。非常感谢!