Пн goose не сохраняет мои данные, сообщение об ошибке: Невозможно прочитать свойство 'then' неопределенного - PullRequest
0 голосов
/ 04 августа 2020

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

const request = require("request");
const Vege = require("./models/Vege");

request(
    "https://data.taipei/api/v1/dataset/f4f80730-df59-44f9-bfb8-32c136b1ae68?scope=resourceAquire&limit=1",
    { json: true },
    (err, res, body) => {
        if (err) return console.log(err);
        let data = body.result.results;        // an array of objects
        

        data.forEach(vege => {
            let trimmed = JSON.parse(
                JSON.stringify(vege).replace(/"\s+|\s+"/g, '"')
            );           // just removing spaces

            const newVege = new Vege({
                品名: trimmed.品名,
                市場: trimmed.市場,
                "平均(元 / 公斤)": trimmed["平均(元 / 公斤)"],
                種類: trimmed.種類,
                日期: trimmed.日期,
            });
            console.log(newVege);              // I do see the object I want to save in the console
            newVege.save(err => console.log(err))      // "Cannot read property 'then' of undefined"
                .then(() => console.log("Saved successfully"));
        })
        
    }
);

Когда я выполняю .save () для моего объекта newVege а затем проверьте коллекцию атласа mongodb, его там нет, и в сообщении об ошибке говорится: «Не удается прочитать свойство 'then' of undefined», что меня сбивает с толку, потому что, когда я console.log newVege, это именно то, что я хотел. Не знаю, почему это не определено и почему не сохраняется. Я благодарен за любую помощь!

---- Обновление ----

Я вроде как исправил проблему с не сохранением данных, переместив приведенный выше код в маршрут «/», теперь код выглядит так:

app.get("/", (req, res) => {
    request(
        "https://data.taipei/api/v1/dataset/f4f80730-df59-44f9-bfb8-32c136b1ae68?scope=resourceAquire&limit=1",
        { json: true },
        (err, res, body) => {
            if (err) return console.log(err);
            let data = body.result.results;

            for (const vege of data) {
                let trimmed = JSON.parse(
                    JSON.stringify(vege).replace(/"\s+|\s+"/g, '"')
                );
                const newVege = new Vege({
                    品名: trimmed.品名,
                    市場: trimmed.市場,
                    "平均(元 / 公斤)": trimmed["平均(元 / 公斤)"],
                    種類: trimmed.種類,
                    日期: trimmed.日期,
                });
                
                newVege
                    .save()
                    .then((vege) => console.log(vege))
                    .catch((err) => res.status(400).json(err));
            };
        }
    );
});

Но тогда у меня возникла новая проблема: когда я тестирую ее с помощью Postman, запрос не останавливается (продолжайте повторять отправку запросов и продолжайте загрузку). Если я нажму «Отмена» и проверил свою базу данных, я действительно увижу сохраненные данные. Есть идеи, почему он продолжает отправлять запросы?

1 Ответ

1 голос
/ 04 августа 2020

Foreach не должен использоваться с асинхронной функцией, такой как save попробуйте использовать for of

Может быть, вот так

for(const vege of data){
  let trimmed = JSON.parse(
    JSON.stringify(vege).replace(/"\s+|\s+"/g, '"')
  );           // just removing spaces

  const newVege = new Vege({
    品名: trimmed.品名,
    市場: trimmed.市場,
    "平均(元 / 公斤)": trimmed["平均(元 / 公斤)"],
    種類: trimmed.種類,
    日期: trimmed.日期,
  });  
  newVege.save()
    .then(result =>{
     //result should contain the saved vege
     console.log("Saved successfully")
   })

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