快速JS应用程序处理请求多次

时间:2017-03-20 13:47:14

标签: javascript node.js mongodb express extjs

我目前正在创建一个使用Sencha Ext JS作为前端部分的应用程序和Node JS来处理来自MongoDB的用户请求和数据检索

当我尝试将数据插入mongoDB时。 Ext JS通过ajax发送请求。它插入成功,但我再次插入。它会插入第二个请求两次。

这是我的server.js的片段

Server.js

var express = require('express')
var app = express() 
var form = require('formidable')
var document = require('/models/Document.js')


var db = .... //connection to my mongodb instance
app.post('/insertDocument', function(req, res){
    document.insertDocument(req, form, db, function(info){
       return res.end(info) 
    });
});

我使用res.end进行发布请求,因为当我发送第二个请求时使用res.send或res.json时,它会给我一个错误。发送后不能发送标题。

Document.js
module.exports = {
    insertDocument: function(req, form, db, callback){
        var collection = db.collection('HD_Documents');
        form.parse(req, function(err, fields, files){
            collection.insert({
                name: fields.name,
                .
                .
                .
                .
            },function(er, info){
                if(er){
                    callback("{'success':false}");
                }else{
                    callback("{'success':true}")
                }
            })
        })
    }

}

就像我说它正确插入一样。但在第二次插入请求。它插入数据两次。我检查了chrome开发人员工具中的网络选项卡。我看到客户端只发送一个请求。但是节点js服务器会对它进行两次处理。

我不知道为什么。我需要帮助。 我以为使用res.send或res.json会解决问题,但就像我说它给我一个错误。

任何帮助将不胜感激。 :)

修改 事实证明,两次处理的函数是强大的form.parse。 我不知道为什么它仍然被叫两次

1 个答案:

答案 0 :(得分:0)

在最后一行回调中只需要一个res.end() 您的代码应如下所示:

    module.exports = function foo(req, res) {
        insertDocument: function(req, form, db, callback){
            var collection = db.collection('HD_Documents');
            form.parse(req, function(err, fields, files){
                collection.insert({
                    name: fields.name,
                    .
                    .
                    .
                    .
                },function(er, info){
                    if(er){
                        callback("{'success':false}");
                    }else{
                        callback("{'success':true}")
                    }
                })
                res.end()
            })
        }

    }