使用下一个路由和 node.js 服务器从 React 调用 Python 脚本

KS1*_*798 5 python node.js reactjs ethereum next.js

我正在开发一个使用 react、next-routing 和基本 node.js 服务器的以太坊应用程序。我想在特定路线上运行一个 python 脚本,声明分析是特定的,以便执行一些预测。我希望每次访问 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");
    });
});
Run Code Online (Sandbox Code Playgroud)

路由.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;
Run Code Online (Sandbox Code Playgroud)

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

Mel*_*hia 4

如果您使用的是 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); 
  }
}
Run Code Online (Sandbox Code Playgroud)

现在让我们在您的路线中使用该函数:

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

})


Run Code Online (Sandbox Code Playgroud)