【问题标题】:How to pass function return value to a object in Node.js如何将函数返回值传递给 Node.js 中的对象
【发布时间】:2020-04-15 17:36:24
【问题描述】:

我是 Node.js 的新手,我正在为我的一个项目开发一个 REST API。

在这种情况下,我有一个发布请求,需要将一些表单数据存储到数据库中。有些值来自表单数据,有些值是基于该表单值生成的。例如,基于持续时间值,它需要根据该值计算最终数据。如果持续时间为 3 个月,则最终日期应根据当前日期更改。如果duration值为一年,则应根据当前日期的duration更改最终日期。

我开发了一个名为releasedfinaldate() 的函数来获取日期,但我无法将该函数值传递给对象。如何将该值传递给文章对象?请帮忙..

router.post('/', (req, res, next)=>{

const articles = new Articles({

    //articleId: new mongoose.Types.ObjectId(),
    first_name: req.body.first_name,
    last_name: req.body.last_name,
    address: req.body.address,
    id_number: req.body.id_number,
    phone_number: req.body.phone_number,
    amount: req.body.amount,
    weight: req.body.weight,
    duration: req.body.duration,
    addtional_details: req.body.addtional_details,   
    interest_paid: req.body.interest_paid,
    speacial_circumstances: req.body.speacial_circumstances,
    released_date: req.body.released_date,
    released_amount: req.body.released_amount,
    date: moment().format('MMMM Do YYYY, h:mm:ss a'),
    released_final_date: releasedfinaldate(req.body.duration)

});


function releasedfinaldate(duration) {
    const oneyear = moment().add(365, 'days').calendar();
    const threemonths = moment().add(90, 'days').calendar();
    const released_final_date= null;
    if (duration === 1) {
        return oneyear
    } else if (duration === 3) {
        return threemonths
    }  
}
//console.log(releasedfinaldate(3))
articles.save()
.then(result =>{
    console.log(result);
})
.catch(err => console.log(err));
res.status(200).json({
    message:'New Article successfully created.',
    createdArticle: articles
});

});`

【问题讨论】:

  • 究竟是什么不起作用?您是否收到某种错误消息?如果是这样,请发布该错误。
  • 你正在传递对象中的值,虽然很奇怪,但你正在传递,released_final_date: releasedfinaldate(req.body.duration)
  • 您的代码可能会异步执行,这只是它发生的原因

标签: javascript node.js rest api express


【解决方案1】:

不知何故,您的日期函数需要一些时间来返回日期值,同时,下一条语句应该执行。这就是您的函数返回未定义的原因。

永远不要忘记 NodeJS 是异步执行语句的。

当我们需要同步执行语句时,我们应该使用promise。

我已经在 repl.it 中测试了这个 sn-p。

我并不是说我用最合格的方式完成了我的代码,但我给了你一个解决方案,你应该使用这种类似的方式进行同步执行。

你还应该用 async..await 代替 promise。

const moment = require('moment');

function generateObject(releasedfinaldate) {
  return new Promise((resolve) => {
    const articles = {
      first_name: "first_name",
      last_name: "last_name",
      address: "address",
      id_number: "id_number",
      phone_number: "phone_number",
      amount: "amount",
      weight: "weight",
      duration: "duration",
      addtional_details: "res",
      interest_paid: "interest_paid",
      speacial_circumstances: "speacial_circumstances",
      released_date: "released_date",
      released_amount: "released_amount",
      date: moment().format('MMMM Do YYYY, h:mm:ss a'),
      released_final_date: releasedfinaldate
    };
    resolve(articles);
  });

}

function releasedfinaldate(duration) {
  return new Promise((resolve) => {
    const oneyear = moment().add(365, 'days').calendar();
    const threemonths = moment().add(90, 'days').calendar();
    const released_final_date = null;
    if (duration === 1) {
      return resolve(oneyear);
    } else if (duration === 3) {
      return resolve(threemonths)
    }
  });
}

releasedfinaldate(3)
  .then((releasedfinaldate) => {
    console.log(releasedfinaldate);
    return generateObject(releasedfinaldate)
  }).then((article) => {
    console.log(article);
  });

【讨论】:

  • 感谢您的回复@Dipak。我解决了这个问题。
  • 不明白我的回答对你有没有帮助。
猜你喜欢
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多