首页 > 解决方案 > 使用下一个路由和 node.js 服务器从 React 调用 Python 脚本

问题描述

我正在开发一个使用 react、next-routing 和基本 node.js 服务器的以太坊应用程序。我想在特定路线上运行 python 脚本,具体来说是 claimAnalysis,以便执行一些预测。我希望每次访问 claimAnalysis 路由时都执行脚本。

服务器.js

const express = require("express")();
const next = require("next");

const app = next({
    dev: process.env.NODE_ENV !== "production"
});

const routes = require("./routes");
const handler = routes.getRequestHandler(app);

app.prepare().then(() => {
    const server = express.use(handler);

    server.listen(3000, (err) => {
        if(err) throw err;
        console.log("Server ready on localhost:3000");
    });
});

路由.js

const routes = require("next-routes")();

routes
    .add("/insurance/new", "/insurance/new")
    .add("/insurance/:address", "/insurance/show")
    .add("/insurance/:address/claims", "/insurance/claims/index")
    .add("/insurance/:address/claims/new", "/insurance/claims/new")
    .add("/insurance/:address/claims/:id/claimAnalysis", "/insurance/claims/claimAnalysis");
    
module.exports = routes;

如果我可以从运行 python 脚本的 claimAnalysis.js 文件中调用一个函数,请指导我。

标签: pythonnode.jsreactjsnext.jsethereum

解决方案


如果您使用的是 Node 10+,则可以使用它来执行返回对象util.promisify的 python 脚本。Promise<{ stdout, stderr }>请参见下面的示例:

const util = require('util');
const exec = util.promisify(require('child_process').exec);

// function to execute python script
async function executeScript(path) {
  try {
    const { stdout, stderr } = await exec(`python3 ${path}`);
    console.log('stdout:', stdout);
    console.log('stderr:', stderr);
  } catch (e) {
    console.error(e); 
  }
}

现在让我们在您的路线中使用该功能:

app.get('/insurance/claims/claimAnalysis', async function (req, res) {
  await executeScript();
  res.send('claimAnalysis request completed');
  ...

})



推荐阅读