Javascript 当通过NodeJS/Express服务器上的jqueryajax调用发送到客户端时,服务器上JS对象上动态创建的属性将消失

Javascript 当通过NodeJS/Express服务器上的jqueryajax调用发送到客户端时,服务器上JS对象上动态创建的属性将消失,javascript,jquery,ajax,node.js,express,Javascript,Jquery,Ajax,Node.js,Express,在客户端,我通过jqueryajax请求调用某个JS对象 $.get("/foo/requestData",function(data){ console.log("Received data is missing added property: ", data); }); 在服务器端,我在DB请求后检索一个包含JS对象的数组。现在,我在该对象上创建了一个新属性,并希望将其发送回客户端: exports.requestData = funct

在客户端,我通过jqueryajax请求调用某个JS对象

$.get("/foo/requestData",function(data){
    console.log("Received data is missing added property: ", data);
});
在服务器端,我在DB请求后检索一个包含JS对象的数组。现在,我在该对象上创建了一个新属性,并希望将其发送回客户端:

  exports.requestData = function(req, res, next) {
    db.myDb.findAll({
      where: { bar: true },
      order: [
        ['id']
      ],
      include: [db.table1, db.table2, db.table3, {
        model: db.table4
      }]
    })
    .then(function(originalResultObject) {
      console.log("This is array with original Objects: ", originalResultObject);
      var newResultObject = originalResultObject.map(function(element) {
        var valueForNewProperty = "something new";
        var newProperty = "newProperty";
        element[newProperty] = valueForNewProperty;
        return element;
      });
      console.log("Added property is here: ", newResultObject);

      res.locals.thresholdSummary = newResultObject;
      res.send(newResultObject);
    })
因此,我在服务器上:

这是具有原始对象的数组:

[实例{dataValues:{foo:“bar1”}

实例{dataValues:{foo:“bar2”}

实例{dataValues:{foo:“bar3”},…]

新增属性如下:

[{foo:“bar1”,newProperty:“新事物”}

{foo:“bar2”,newProperty:“新事物”}

{foo:“bar3”,newProperty:“新事物”},…]

但在客户端站点上,它丢失了:

接收到的数据缺少添加的属性:

[{foo:“bar1”}

{foo:“bar2”}

{foo:“bar3”},…]

这可能与将JS对象转换为JSON有关。在发送到客户端时,将新添加的属性转换为JSON后被忽略。但是,如何在服务器上持续添加新属性并将其发送到客户端


顺便说一句:最顶端的数组表示“Instance{dataValues:…}”,这两者之间的区别是什么?

您在回调完成之前发送响应。试试这个:

exports.requestData = function(req, res, next) {
db.myDb.findAll({
  where: { bar: true },
  order: [
    ['id']
  ],
  include: [db.table1, db.table2, db.table3, {
    model: db.table4
  }]
})
.then(function(originalResultObject) {
  console.log("This is original Object: ", originalResultObject);
  var newResultObject = originalResultObject.map(function(element) {
    var valueForNewProperty = "something new";
    var newProperty = "newProperty";
    element[newProperty] = valueForNewProperty;

    console.log("Added property is here: ", newResultObject);

    res.locals.thresholdSummary = newResultObject;
    res.send(newResultObject);
    return element;
  });

})

注意:我将
res.send
向上移动到回调中

只添加到新属性必须添加到原始对象的
dataValues
属性中,即:

originalObject.dataValues.addedProperty = "something new";

原始结果对象是什么类型的数据?它是一个对象数组吗?它是数据库中的某个自定义对象吗?您的
console.log()
语句使它看起来像是在对普通对象调用
.map()
,并期望它返回另一个普通对象。这很令人困惑。通常,会对数组调用
.map()
,但不会在任何地方显示数组。@jfriend00 yes originalResultObject是一个对象数组,即“元素”。在这些元素上,我添加了一个新属性,希望在客户端读取该属性。命名确实令人困惑。这不是回调函数,而是映射函数。但是谢谢。也许我必须用promise all解析带有原始对象的数组。