Node.js-如何通过回调调用异步函数?

时间:2020-02-20 06:48:43

标签: node.js asynchronous mongoose callback

下面的异步函数应该检查网址是否为合法网址

let CheckUrl = function (url, done) {
  dns.lookup(url, function(err, address) { 
    if (err) return done(err);
    done(null, true); //return true because I don't care what the address is, only that it works
  });
} 

下面的express.js代码获取url,但是我在理解如何编写if语句以使其返回true或false时遇到了麻烦。

// Gets URL 
app.post("/api/shorturl/new", function(req, res) {
  if (CheckUrl(req.body.url)) {
    // do something
  }
});

我不确定在此if语句中作为CheckUrl()中的第二个参数传递什么。还是我最初写的第一个异步函数不正确?

2 个答案:

答案 0 :(得分:0)

请使用async await

我为您编写了以下测试代码:

const express = require('express');
const app = express();
const dns = require('dns');


let CheckUrl = function (url, done) {
    return new Promise((resolve, reject) => {
        dns.lookup(url, function(err, address) {
            console.log("err " , err)
            if (err) {
                resolve(false)
            } else {
                resolve(true)
            }

        });
    });
} 


app.post("/api/shorturl/new", async function(req, res) {

  try {

    let result = await CheckUrl(req.body.url);
    console.log("result " , result)
    res.send(result)
  }
  catch (error) {
    console.log("in catch error " , error)
    res.send(error)
  }
});

app.listen(3000)

您可以获取有关Promise here的知识。 Promise对象表示异步操作的最终完成(或失败)及其结果值。

答案 1 :(得分:0)

正如DeepKakkar所提到的,这就是我想要的:

app.post("/api/shorturl/new", async (req, res) => {
  try {
    let result = await CheckUrl(req.body.url);
    res.send(result)
  }
  catch (error) {
    return new Error('Could not receive post');
  }
});