Node.js 如果db调用抛出错误,如何返回错误头?
我有一个小型的数据收集web应用程序,运行在NodeJS和Couchbase上。要求是,当第三方向我们推送某些数据并且我们能够处理它时,我们返回200报头,但如果存储该数据有任何问题,我们返回500。这意味着他们可以重新尝试失败的数据批处理 我遇到了一个始终返回200的问题(因为DB调用是异步完成的)。下面是一个例子:Node.js 如果db调用抛出错误,如何返回错误头?,node.js,express,couchbase,Node.js,Express,Couchbase,我有一个小型的数据收集web应用程序,运行在NodeJS和Couchbase上。要求是,当第三方向我们推送某些数据并且我们能够处理它时,我们返回200报头,但如果存储该数据有任何问题,我们返回500。这意味着他们可以重新尝试失败的数据批处理 我遇到了一个始终返回200的问题(因为DB调用是异步完成的)。下面是一个例子: ... var app = express(); function create(req, res) { var error = false; // Par
...
var app = express();
function create(req, res) {
var error = false;
// Parse all the entries in request
for (var i = 0; i < req.body.length; i++) {
var event = req.body[i];
if (!event.email) {
// log error to file
error = true;
res.send("Event object does not have an email address!", 500);
}
// Greate the id index value
var event_id = 'blah';
// See if record already exists
db.get(event_id, function (err, result) {
var doc = result.value;
if (doc === undefined) {
// Add a new record
db.add(event_id, event, function (err, result) {
if (err) {
error = true;
res.send('There were processing errors', 500);
}
});
}
});
}
if (error)
res.send("Try again", 500);
else
res.send("OK", 200);
}
app.post('/create', create);
。。。
var-app=express();
函数创建(req、res){
var错误=错误;
//解析请求中的所有条目
对于(变量i=0;i
是否有办法使应用程序等待这些DB调用完成,即此函数是同步的?还是我用错技术了(
我决定使用NodeJS+Couchbase,因为我们可能会有大量的调用,其中数据(小的JSON对象)必须写入、读取和删除。编辑:啊,数据结构可能会因各种事件而改变,因此能够存储形状不一致的文档是一个很大的优势!这是的典型用例,它是一个实用程序带库,有许多模式可用于异步函数 由于需要为每个记录调用异步函数,因此可以使用,它对数组的所有元素执行异步函数。当所有异步任务完成时,将调用最后一次回调
var app = express();
function handleEvent = function (event, callback) {
if (! event.email) {
callback(new Error('Event object does not have an email address!'));
}
var event_id = 'blah';
db.get(event_id, function (err, result) {
var doc = result.value;
if (doc === undefined) {
// Add a new record
db.add(event_id, event, function (err, result) {
if (err) {
callback(new Error('There were processing errors'));
}
else {
callback(null);
}
});
}
});
}
function create(req, res) {
// https://github.com/caolan/async#each
async.each(req.body, handleEvent, function (err) {
if (err)
res.send(err.message, 500);
else
res.send('OK', 200);
});
}
啊,你给了我希望:)我真的在考虑回到php。。。谢谢你可能是个愚蠢的问题(我也只是在学习node)——但我们不应该返回回调吗?或者至少在回调后返回,以停止此函数的进一步执行?如果您想编写良好的(读取异步)node.js应用程序,在大多数情况下,您的函数不会返回任何内容。它们(函数)只调用另一个函数——回调。这种方法通常称为“”。下面是一个链接,它对节点管理器非常有用。它有不同的语言版本,所以我认为它将是不可替代的,并且易于阅读。回答您的问题-停止函数执行-编写
return如果只是一个简单的调用,您不需要在调用后执行,请尽快执行code>。return
在异步函数中通常用于立即停止函数执行(例如,为了不编写大的if…else
),因为没有人关心异步函数的返回值:当异步函数执行时。函数有一个结果,它只是用结果调用另一个函数。