【问题标题】:Unexpected End of Input Error输入错误意外结束
【发布时间】:2014-02-28 15:27:14
【问题描述】:

我有这个 nodejs 应用程序,我所做的调用之一是 upsert 调用,它将请求正文 upsert 到 mongodb。如果请求正文存在于 mongo 中,则更新它,否则插入它。插入部分正常工作,但是,我在插入部分遇到问题。我的请求正文是由我编写的 C# 应用程序生成的。

好的,所以当我更新时,我需要使用 $addToSet 和 $each 命令,因为我正在将元素添加到 mongo 文档中的数组中。

这是一个示例请求正文(这是一个 POST),这是发送到我的 nodejs 应用程序的内容:

{
    "$addToSet": {
        "Data": {
            "$each": [
                {"ID":"10","RandNum":"45"},
                {"ID":"11","RandNum":"1"},
                {"ID":"12","RandNum":"3"}
            ]
        }
     }
}

文档在mongo中是这样格式化的:

{
    "Timestamp": "timestamp",
    "Id": "12345",
    "Header": {
        "Name": "Name",
        "Query": "SELECT * FROM test"
    },
    "Data": [
        {
            "ID": "1",
            "RandNum": "34"
        }, {
            "ID": "4",
            "RandNum": "23"
        }
    ]
}

我只对插入“数据”数组感兴趣,所以我使用 $addToSet 和 $each 运算符。

这是我对 nodejs 应用程序的 upsert 调用,实际函数有很多代码,所以我只放 upsert 部分:

var db = require('../db.js');
var ind = require('./index.js');
var mongo = require('mongodb').MongoClient;

exports.upsert = function(req, res) {
    var token = req.params.token;
    var app = req.params.applicationId;
    var dataObject = {
        "Status": 1,
        "DataObject": {},
        "UserFriendlyErrorMessage": "",
        "DeveloperErrorMessage": ""
    };

    // set response header
    res.writeHead(200, {"Content-Type": "application/json"});
    res.writeHead(200, {"Content-Length": Buffer.byteLength(req.body)});

    var upsertDatabase = mongo.connect(ind.mongoLoc + databaseName, function(err, newDb) {
        if(err)
            throw err;
        var upsertCollection = newDb.collection(collectionName);
        if(newDb) {
            if(req.query.query) {
                // UPSERT
                try {
                    var json = JSON.parse(req.query.query);
                    upsertCollection.update(json, req.body, {upsert: true, multi: false}, function(err, records) {
                        if(err)
                            throw err;
                        console.log("Data updated");
                    });
                } catch(e) {
                    dataObject["DataObject"] = null;
                    dataObject["UserFriendlyErrorMessage"] = "Could not update";
                    dataObject["DeveloperErrorMessage"] = e;
                    res.end(JSON.stringify(dataObject, 0, 4));
                    console.log(e);
                }
            } else {
                 // INSERT
                 upsertCollection.insert(req.body, function(err, records) {
                    if(err)
                        throw err;
                    console.log("Data inserted");
                 });
             }
             dataObject["Status"] = 0;
             dataObject["DataObject"] = null;
             res.end(JSON.stringify(dataObject, 0, 4));
         } else {
            // could not connect to database
            dataObject["DataObject"] = null;
            dataObject["UserFriendlyErrorMessage"] = "Could not connect to database";
            dataObject["DeveloperErrorMessage"] = "ERROR: Could not connect to database";
            res.end(JSON.stringify(dataObject, 0, 4));
        }
    });
};

在这个函数中,我正在测试文档是否存在,如果存在则更新它。这是我关注的部分。 dataObject 是我返回给用户以显示错误/成功的内容。

当我将数据发布到此调用时,我收到此错误(我正在 Fiddler 中查看 POST 调用):

HTTP/1.1 504 Fiddler - Receive Failure
Date: Fri, 28 Feb 2014 15:30:39 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Cache-Control: no-cache, must-revalidate
Timestamp: 10:30:39.535

[Fiddler] ReadResponse() failed: The server did not return a response for this request.Server returned 0 bytes

Content-Type 应该是 application/json

【问题讨论】:

  • 您的节点方法中有多个日志语句。如果有的话,哪个被调用?这应该有助于缩小代码路径。
  • 我认为console.log(e);应该调用语句。我会弄清楚的
  • 我发现了问题所在。我删除了content-length 语句并修复了它。

标签: javascript node.js mongodb express


【解决方案1】:

我修好了。似乎这条线

res.writeHead(200, {"Content-Length": Buffer.byteLength(req.body)});

不允许它发布数据。我尝试删除它并且 upsert 工作。

但是,我想知道为什么删除它会起作用。我认为 Content-Length 是必要的,因为它指定了正文的长度。

【讨论】:

  • 在上面的代码中,您正在为响应(输出)指定输入的内容长度...这实际上是无效的内容长度...响应中的内容长度header 应该是你的输出(在上面的例子中,它是你的 JSON 响应数据的长度)
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2018-08-24
  • 2014-09-30
相关资源
最近更新 更多