如何在post函数之外使用变量?

时间:2019-09-15 22:20:27

标签: node.js express dialogflow webhooks

我将如何做到这一点,以便可以在app.post函数之外引用变量名称,年龄和电话,以便可以在const数据中使用它们,并在axios.post指令中使用它们?

我尝试在一开始就声明它们,但是没有用。没有任何价值。

const express = require("express");
const bodyParser = require("body-parser");
const app = express();
const port = process.env.PORT || 3000;
const ip = process.env.IP || "127.0.0.1";
const axios = require("axios");
//
app.use(bodyParser.urlencoded({
    extended: false
}));
app.use(bodyParser.json());
//
app.post('/', function (req, res) {
    const name = req.body.queryResult.parameters.name;
    const age = req.body.queryResult.parameters.age;
    const phone = req.body.queryResult.parameters.phone;
    //
    res.json(response);
});
const data = [{
    "Name": name,
    "Age": age,
    "Phone": phone
}];
axios.post('https://sheet.best/api/sheets/5296b88f-a7c9-57c2-accc-f445cf323c5e', data);

app.listen(port, ip);

现在编码的方式是错误“未定义变量”,但是如果在开始时声明它们,则不会获得任何值。

1 个答案:

答案 0 :(得分:0)

我认为您对javascript的同步及其“异步”行为感到困惑。 app.post进行“回调”。 “回调”是一个函数,在收到HTTP请求时,将在一定的时间范围内(视您的情况而定)进行调用。执行代码后,您的axios.post函数将在回调传递给app.post之前执行。因此data中的所有键将永远不会被定义。 name, age, phone从未在使用范围内声明。

我建议创建一个通用函数,该函数接受参数name, age, phone并执行axios.post逻辑。因此,您可以在每个app.post上重用此功能。我在您可以执行的操作下面创建了一个代码段。它使用Promisesasync/await来管理异步活动。

const express = require("express");
const bodyParser = require("body-parser");

const app = express();
const port = process.env.PORT || 3000;
const ip = process.env.IP || "127.0.0.1";
const axios = require("axios");

app.use(
    bodyParser.urlencoded({
        extended: false
    })
);

app.use(bodyParser.json());

async function postData(name, age, phone) {
    const data = [
        {
            Name: name,
            Age: age,
            Phone: phone
        }
    ];

    const result = await axios.post(
        "https://sheet.best/api/sheets/5296b88f-a7c9-57c2-accc-f445cf323c5e",
        data
    );

    return result;
}

app.post("/", async function(req, res) {
    const name = req.body.queryResult.parameters.name;
    const age = req.body.queryResult.parameters.age;
    const phone = req.body.queryResult.parameters.phone;

    const result = await postData(name, age, phone);

    return res.json(result);
});

app.listen(port, ip);