Когда я пытаюсь запустить эту строку кода в «node.js», я получаю следующую ошибку - PullRequest
0 голосов
/ 25 мая 2020
const express = require('express');
const request = require('request');
const bodyParser = require('body-parser');
const https = require('https');
const app = express();

app.use(express.static('public'));
app.use(bodyParser.urlencoded({extended: true}));
app.get('/', function(req, res){
  res.sendFile(__dirname + "/signup.html");
});
app.post('/', function(req,res){
  const firstName = req.body.fName;
  const lastName = req.body.lName;
  const email = req.body.email;
  const data = {
    members: [
      {
        email_address:  email,
        status: "subscribed",
        merge_fields: {
          FNAME: firstName,
          LNAME: lastName
        }
      } 
    ]
  };

  const jsonData = JSON.stringify(data);
  const url ="https://us18.api.mailchimp.com/3.0/lists/081d03d860";
  const options ={
    method: "POST",
    auth: "mick:2c775770a96a720b8c492df7974840d3-us18"
  }

  const request = https.request(url, options, function(response) {
    if (response.statusCode === 200){
      response.send('Successfully subscribed');
    } else {
      response.send('There was an error with singing up, please try again');
    }

    response.on('data', function(data){
      console.log(JSON.parse(data));
    });
  });

  request.write(jsonData);
  request.end();
});

app.listen(3000, function(){
  console.log('Server is running on port 3000');
});

В настоящее время я использую Node.js для создания страницы подписки на информационный бюллетень с mailchimp в качестве API. Когда я запускаю код в node.js, я продолжаю получать эту строку с ошибкой. Я пытаюсь использовать API mailchimp. Я создаю страницу подписки на информационный бюллетень. Но я продолжаю получать эту ошибку. Я запускаю его в node.js. Кто-нибудь может мне помочь.

TypeError: "listener" argument must be a function
    at ClientRequest.once (events.js:340:11)
    at new ClientRequest (_http_client.js:164:10)
    at Object.request (http.js:38:10)
    at Object.request (https.js:239:15)
    at C:\Users\Desmond\Desktop\Web Development\Newsletter-Singup\app.js:40:24
    at Layer.handle [as handle_request] (C:\Users\Desmond\Desktop\Web Development\Newsletter-Singup\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Desmond\Desktop\Web Development\Newsletter-Singup\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\Desmond\Desktop\Web Development\Newsletter-Singup\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\Desmond\Desktop\Web Development\Newsletter-Singup\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\Desmond\Desktop\Web Development\Newsletter-Singup\node_modules\express\lib\router\index.js:281:22

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

Внутри этого:

app.post('/', function(req, res) {    // <== Note the response here is named res

У вас есть это:

const request = https.request(options, function(response) {
    if (response.statusCode === 200) {
        response.send('Successfully subscribed');     // <== This is trying to send a 
                                                      // response to your response which 
                                                      // doesn't make sense

    } else {
        response.send('There was an error with singing up, please try again');
    }

Это не имеет смысла. Вы не звоните по номеру response.send() по только что полученному ответу http.request. Этот HTTP-запрос выполнен. Вы сделали запрос и получили ответ.

Я полагаю, вы имеете в виду, что этот код должен быть таким, где вы отправляете ответ со своего сервера обратно на исходный запрос клиента:

const request = https.request(options, function(response) {
    if (response.statusCode === 200) {
        res.send('Successfully subscribed');    // <== use res here so it refers to the
                                                // response to the original Express
                                                // request/response

    } else {
        res.send('There was an error with singing up, please try again');
    }

К вашему сведению, вы можете принять во внимание, что библиотека request() устарела и, как правило, не должна использоваться для нового кода. Здесь есть список хороших альтернатив . Я лично использую got(), так как считаю его простым в использовании, полностью поддерживает обещания (именно так вы должны программировать асинхронный код в наши дни) и содержит необходимые мне функции.

0 голосов
/ 25 мая 2020

При чтении do c модуля https я вижу, что показаны следующие аргументы:

  • запрос (URL, параметры)
  • запрос (параметры, callback)

Не могли бы вы попробовать изменить свой код этим?

app.post('/', function(req, res) {
    const firstName = req.body.fName;
    const lastName = req.body.lName;
    const email = req.body.email;

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

    const jsonData = JSON.stringify(data);

    const options = {
        hostname: 'us18.api.mailchimp.com',
        path: "/3.0/lists/081d03d860",
        method: "POST",
        auth: "mick:2c775770a96a720b8c492df7974840d3-us18"
    }

    const request = https.request(options, function(response) {
        if (response.statusCode === 200) {
            response.send('Successfully subscribed');

        } else {
            response.send('There was an error with singing up, please try again');
        }

        response.on('data', function(data) {
            console.log(JSON.parse(data));
        });
    });

    request.write(jsonData); 
    request.end();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...