使用Node和Express向外部API发布数据的问题。

问题描述 投票:0回答:1

我正试图用node.js和express将数据从我的表单发布到MailChimp API服务器。然而,我得到了一个错误信息,似乎很奇怪,无法调试。我已经检查了我的index.html文件,一切正常。请帮我找出一个解决方案,或者给我指出正确的方向。请检查我下面的代码。

const express = require("express");
const bodyParser = require("body-parser");
const https = require("https");
const app = express();
app.use(bodyParser.urlencoded({extended:true}));
app.use(express.static("public"));
app.listen(3000, function(){

  "Server is running on Port 3000!"
});

app.get("/", function(req, res){

  res.sendFile(__dirname + "/signup.html");
});

app.post("/", function(req, res){
const firstName = req.body.firstName;
const lastName = req.body.lastName;
const email = req.body.email;
  console.log(firstName, lastName, email);

var data= {
  members: [
{
email_address : email,
status : "subscribed",
merge_fields : {
  FNAME : firstName,
  LNAME : lastName
}
}
  ]
};

var jsonData = JSON.stringify(data);
const url ="https://us10.api.mailchimp.com/3.0/lists/{apikey}";
const options = {
method: "post",
auth: "xxxx:xxxx"
}
const request= https.get(url, options, function(response){
 response.on("data", function(data){
   console.log(JSON.parse(data));
 })
})
request.write(jsonData);
request.end();

});

这是我得到的错误。


events.js:200
      throw er; // Unhandled 'error' event
      ^

Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at write_ (_http_outgoing.js:594:17)
    at ClientRequest.write (_http_outgoing.js:586:15)
    at C:\Users\Iredafe\Desktop\Web Development practice\Email-List\app.js:48:9
    at Layer.handle [as handle_request] (C:\Users\Iredafe\Desktop\Web Development practice\Email-List\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Iredafe\Desktop\Web Development practice\Email-List\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\Iredafe\Desktop\Web Development practice\Email-List\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Iredafe\Desktop\Web Development practice\Email-List\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Iredafe\Desktop\Web Development practice\Email-List\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\Iredafe\Desktop\Web Development practice\Email-List\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\Iredafe\Desktop\Web Development practice\Email-List\node_modules\express\lib\router\index.js:275:10)
Emitted 'error' event on ClientRequest instance at:
    at writeAfterEndNT (_http_outgoing.js:649:7)
    at processTicksAndRejections (internal/process/task_queues.js:82:21) {
  code: 'ERR_STREAM_WRITE_AFTER_END'
}
[nodemon] app crashed - waiting for file changes before starting...
javascript node.js mailchimp-api-v3.0
1个回答
0
投票

你可以用axios来简化。

const axios = require('axios');

const headers = {
  'Content-Type': 'application/json',
  'Authorization': 'JWT fefege...'
}

axios.post(url,postPayload,headers)
  .then(response => {
    console.log(response.data);

  })
  .catch(error => {
    console.log(error);
  });

0
投票

我刚刚找到了答案。这是我代码中的一个bug。我在Node中使用原生的https方法,因此我不应该使用https.get here。


const request= https.get(url, options, function(response){
 response.on("data", function(data){
   console.log(JSON.parse(data));
 })
})
request.write(jsonData);
request.end();

正确的代码是使用http.request而不是http.get来解决这个问题。

const request= https.request(url, options, function(response){
 response.on("data", function(data){
   console.log(JSON.parse(data));
 })
})
request.write(jsonData);
request.end();

希望对以后的人有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.