Node.js 什么';从golang执行nodejs脚本(返回字符串),然后将该字符串传递回golang变量的最佳方式是什么?
我目前正在使用golang一侧的Node.js 什么';从golang执行nodejs脚本(返回字符串),然后将该字符串传递回golang变量的最佳方式是什么?,node.js,string,go,exec,Node.js,String,Go,Exec,我目前正在使用golang一侧的os/exec和Stdout,以及nodejs一侧的console.log(“字符串”)来执行 基本上,我需要生成一个字符串,但只能在nodejs中生成,但我的大部分代码都在golang中,所以我试图使我的代码中的这一点尽可能无缝、安全和可靠,我对将程序的如此重要的一部分放在“console.log”上并从shell输出读取感到有点不安 简而言之:我想知道在我的节点和go代码之间是否存在一条更好、更标准的通信线路,然后是console.log+shell输出,或者
os/exec
和Stdout
,以及nodejs一侧的console.log(“字符串”)
来执行
基本上,我需要生成一个字符串,但只能在nodejs中生成,但我的大部分代码都在golang中,所以我试图使我的代码中的这一点尽可能无缝、安全和可靠,我对将程序的如此重要的一部分放在“console.log”上并从shell输出读取感到有点不安
简而言之:我想知道在我的节点和go代码之间是否存在一条更好、更标准的通信线路,然后是console.log+shell输出,或者这是否足够理想
哦,我的程序的这个特殊部分的功能是获取一个标记文本文件,并使用HTML将其转换为HTML
一些想法:
- 通过HTTP进行通信(将数据/字符串发送到golang HTTP侦听器)
- 通过文件系统进行通信(将字符串写入临时文件并使用golang读取)
- 通过“类似于HTTP但特定于本地应用程序数据共享的东西”进行通信
parser.go
package main
import (
"os"
"os/exec"
"fmt"
"bytes"
)
func main() {
cmd := "node"
args := []string{"parser.js", "/home/user1/dev/current/wikis/Bob's Pain/markup/index.md"}
process := exec.Command(cmd, args...)
stdin, err := process.StdinPipe()
if err != nil {
fmt.Println(err)
}
defer stdin.Close()
buf := new(bytes.Buffer) // THIS STORES THE NODEJS OUTPUT
process.Stdout = buf
process.Stderr = os.Stderr
if err = process.Start(); err != nil {
fmt.Println("An error occured: ", err)
}
process.Wait()
fmt.Println("Generated string:", buf)
}
parser.js
var md = require('markdown-it')();
var yaml = require('js-yaml');
var fs = require('fs');
if (process.argv.length < 3) {
console.log('Usage: node ' + process.argv[1] + ' FILENAME');
process.exit(1);
}
var filename = process.argv[2];
fs.readFile(filename, 'utf8', function(err, data) {
if (err) {
throw err;
}
parse(data)
});
function parse(data) {
data = data.split("---")
yamlData = data[1];
markData = data[2];
y = yamlProcess(yamlData);
markData = "# "+y.title+"\n\n"+markData
html = markdownToHTML(markData);
console.log(html) // SEND THE DATA BACK TO GOLANG
}
function yamlProcess(data) {
try {
var doc = yaml.safeLoad(data);
return doc;
} catch (e) {
console.log(e);
return {};
}
}
function markdownToHTML(data) {
return md.render(data);
}
var md=require('markdown-it')();
var yaml=require('js-yaml');
var fs=需要('fs');
如果(进程argv.length<3){
log('Usage:node'+process.argv[1]+'FILENAME');
过程。退出(1);
}
var filename=process.argv[2];
fs.readFile(文件名'utf8',函数(错误,数据){
如果(错误){
犯错误;
}
解析(数据)
});
函数解析(数据){
data=data.split(“--”)
yamlData=数据[1];
markData=数据[2];
y=yamlProcess(yamlData);
markData=“#”+y.title+”\n\n“+markData
html=markdowntothtml(markData);
console.log(html)//将数据发送回GOLANG
}
函数yamlProcess(数据){
试一试{
var doc=yaml.safeLoad(数据);
退货单;
}捕获(e){
控制台日志(e);
返回{};
}
}
函数markdownToHTML(数据){
返回md.render(数据);
}
我从两方面都达到了类似的要求
对于构建管道扩展,我将编写一个Python脚本,从命令行获取参数并将结果输出到stdout。这是一个简单的界面,用于“运行一次”,“一切都成功,否则会很快失败”的用法。如果你的情况也是这样,我会保持实现不变
对于一个web应用程序,我只为一个特定的函数提供了Java服务(在我的例子中,是从自然语言字符串识别日期)。这样做的好处是,应用程序在调用时已经“预热”,并且肯定会更快地响应,而不是在每次请求到来时启动。随着时间的推移,使用rest接口可能会带来更多好处,例如更简单的客户端实现、监控、部署选项、无需更改客户端的交换机实现等。这种方式更为传统。最简单的方法是:
“输出”是从NodeJS脚本打印的数据。“command”是任何字符串形式的命令。请原谅我的提问,但是不能使用go markdown处理器吗?我可以,但我想在服务器和浏览器上使用相同的“markup to html”代码。
command := "node parser.js /path/to/some/file.md"
parts := strings.Fields(command)
data, err := exec.Command(parts[0], parts[1:]...).Output()
if err != nil {
panic(err)
}
output := string(data)