Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如果db调用抛出错误,如何返回错误头?_Node.js_Express_Couchbase - Fatal编程技术网

Node.js 如果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

我有一个小型的数据收集web应用程序,运行在NodeJS和Couchbase上。要求是,当第三方向我们推送某些数据并且我们能够处理它时,我们返回200报头,但如果存储该数据有任何问题,我们返回500。这意味着他们可以重新尝试失败的数据批处理

我遇到了一个始终返回200的问题(因为DB调用是异步完成的)。下面是一个例子:

...
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
return
在异步函数中通常用于立即停止函数执行(例如,为了不编写大的
if…else
),因为没有人关心异步函数的返回值:当异步函数执行时。函数有一个结果,它只是用结果调用另一个函数。