简体   繁体   English

如何在expressJs中完成实用程序执行后返回REST API响应

[英]How to return REST API response after utility execution is finished in expressJs

I have written one POST endpoint in expressJS with node.when I a make call to API It runs a utility with setInterval() and I want to send the API response after utility executes clearInterval().我已经用 node 在 expressJS 中编写了一个 POST 端点。当我调用 API 它使用 setInterval() 运行一个实用程序并且我想在实用程序执行 clearInterval() 后发送 API 响应。 How I can I wait and send response after utility execution is finished?实用程序执行完成后如何等待并发送响应? Please see the code below请看下面的代码

REST API code: REST API 代码:

const router= express.Router();
const multer= require('multer');
const {readCSVFile}= require('../util/index');
var storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'uploads');
    },
    filename: (req, file, cb) => {
        cb(null, file.fieldname + '-' + Date.now()+'.xlsx');

    }
});
var upload = multer({storage: storage});
router.post('/fileUpload', upload.single('filename'),   async (req, res) => {
    readCSVFile();
    res.status(201).json({id:1});
});
router.get('/',(req,res)=>{
    res.sendFile(__dirname+'/index.html');
});

module.exports=router;


Utilty Code实用程序代码

const config = require('config')
const excelToJson = require('convert-excel-to-json')
const HttpsProxyAgent = require('https-proxy-agent')
const AWS = require('aws-sdk')
const json2xls = require('json2xls')
const fs = require('fs')
const awsConfig = {
    httpOptions: {
        agent: new HttpsProxyAgent(
            config.get('aws.proxy')
        ),
    }
}
AWS.config.credentials = new AWS.SharedIniFileCredentials({
    profile: config.get('aws.profile'),
})
AWS.config.update(awsConfig)

let uuidv4 = require('uuid/v4')
let csv = [];

const lexRunTime = new AWS.LexRuntime({
    region: config.get('aws.region'),
})
let refreshId
const readCSVFile = () => {

    const csvSheet = excelToJson({
        sourceFile: './Test.xlsx',
    })
    csvSheet.Sheet1.forEach(element => {
        csv.push((element.A.slice(0, element.A.length)))
    })
    runTask()
    refreshId = setInterval(runTask, 1000)
}
let botParams = {
    botAlias: config.get('bot.alias'),
    botName: config.get('bot.name'),
    sessionAttributes: {},
}
const missedUtterancesArray = []
const matchedUtterancesArray = []
let start = 0
let end = 50
let count = 50

const runTask = () => {
    let itemsProcessed = 0
    console.log('executing...')
    const arrayChunks = csv.slice(start, end)
    arrayChunks.forEach((element) => {
        botParams.inputText = element
        botParams.userId = `${uuidv4()}`
        lexRunTime.postText(botParams, function (err, data) {
            itemsProcessed++
            if (err) console.log(err, err.stack)
            else {
                if (data.intentName === null) {
                    missedUtterancesArray.push({
                        Utterance: element,
                    })
                }
                else{
                    matchedUtterancesArray.push({
                        Utterance: element,
                    })
                }
            }
            if (itemsProcessed === arrayChunks.length) {
                start = csv.indexOf(csv[end])
                end = start + count
            }
            if (start === -1) {
                let xls = json2xls(missedUtterancesArray)
                fs.writeFileSync('./MissedUtterances.xlsx', xls, 'binary')
                let matchedXls = json2xls(matchedUtterancesArray)
                fs.writeFileSync('./MatchedUtterances.xlsx', matchedXls, 'binary')
                console.log('File saved successfully!! ')
                console.log('Total Matched utterances count: ',csv.length-missedUtterancesArray.length)
                console.log('Total Missed utterances count: ',missedUtterancesArray.length)
                console.log('Total Utterances count: ',csv.length)
                clearInterval(refreshId)
            }
        })
    })
}

I would have needed few more information to answer this but pardon my try if this does not work -我需要更多信息来回答这个问题,但如果这不起作用,请原谅我的尝试 -

the setInterval method in the readCSVFile the reason. readCSVFile 中的setInterval方法的原因。 Being an asynchronous function, this will not stop the code progression.作为异步 function,这不会停止代码进程。

lexRunTime.postText also looks like asynchronous. lexRunTime.postText也看起来像异步的。 I think you'd be better off with using promises while responding to the client.我认为在响应客户时使用承诺会更好。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM