首页 > 解决方案 > NodeJS 和 HTTP:如何在 POST/PUT 调用中将 JSON 内容作为字符串发送而不是创建新密钥

问题描述

我构建了一个 API 服务,它将处理 REST 请求并使用它们在 MongoDB 实例上执行 CRUD 操作。这个应用程序是独立的(按设计),应该是调用它的任何东西的传递。我在 Angular 中构建的另一个应用程序正在调用这个 API 来与我的 MongoDB 实例进行交互。我一直在尝试从一个表单构建我的 JSON 有效负载,它工作正常。我得到类似的东西:

{ "_id":"111111111", "name":"herp", "address":"derp", "city":"foo", "state":"bar", "zip":"11111", "phone":"111-222-3333"}    

然后我尝试获取该 JSON 并将其发送到服务,但是一旦服务获取它并且我的包含 JSON 对象的变量名被转换为请求中的实际键,翻译中就会丢失一些东西,以 JSON 作为其值。我这样调用服务:

const httpOptions = {
    headers: new HttpHeaders({ 'Content-Type': 'application/json', 'Cache-Control': 'no-cache' })
};

updateStuff(update){
   console.log("Sending: " + JSON.stringify(update) + " for update");
   return this.http.put('http://localhost:3000/api/test/_update', {dbName:"testDb",collection:"testing",update}, httpOptions);
}

哪些日志:

Sending: {"name":"blah","address":"111 Anystreet","city":"MyCity","state":"NY","zip":"11111","phone":"555-111-2222","_id":"5ba914df13236f7a6ea3e233"} for update

所以我知道在打电话之前,数据很好。但是,另一方面,它在获取数据时会看到以下内容:

Received request: {"dbName":"testDb","collection":"testing","update":{"name":"blah","address":"111 Anystreet","city":"MyCity","state":"NY","zip":"11111","phone":"555-111-2222","_id":"5ba914df13236f7a6ea3e233"}}

而不是我想要的,如下所示:

{"dbName":"testDb","collection":"testing","name":"blah","address":"111 Anystreet","city":"MyCity","state":"NY","zip":"11111","phone":"555-111-2222","_id":"5ba914df13236f7a6ea3e233"}

如何告诉 HTTP 请求发送数据本身,而不是构造一个名为“update”的新密钥并将有效负载作为其值粘贴在那里?我尝试了 JSON.stringify,但最终发送了相同的内容,但所有括号前面都有一堆反斜杠。它仍然将其全部发送到一个名为“update”的密钥中。任何帮助将不胜感激。

标签: jsonnode.jsangularhttp

解决方案


你的问题在这里:

{dbName:"testDb",collection:"testing",update}

上面的语句是对此的简写:

{dbName:"testDb",collection:"testing",update:update}

您要做的

{dbName:"testDb",collection:"testing",...update}

这是这个的简写:

const data = {dbName:"testDb",collection:"testing"};
for (let key in update) {
    if (update.hasOwnProperty(key)) {
        data[key] = update[key];
    }
}

推荐阅读