Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 什么';从golang执行nodejs脚本(返回字符串),然后将该字符串传递回golang变量的最佳方式是什么?_Node.js_String_Go_Exec - Fatal编程技术网

Node.js 什么';从golang执行nodejs脚本(返回字符串),然后将该字符串传递回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输出,或者

我目前正在使用golang一侧的
os/exec
Stdout
,以及nodejs一侧的
console.log(“字符串”)
来执行

基本上,我需要生成一个字符串,但只能在nodejs中生成,但我的大部分代码都在golang中,所以我试图使我的代码中的这一点尽可能无缝、安全和可靠,我对将程序的如此重要的一部分放在“console.log”上并从shell输出读取感到有点不安

简而言之:我想知道在我的节点和go代码之间是否存在一条更好、更标准的通信线路,然后是console.log+shell输出,或者这是否足够理想

哦,我的程序的这个特殊部分的功能是获取一个标记文本文件,并使用HTML将其转换为HTML

一些想法:

  • 通过HTTP进行通信(将数据/字符串发送到golang HTTP侦听器)
  • 通过文件系统进行通信(将字符串写入临时文件并使用golang读取)
  • 通过“类似于HTTP但特定于本地应用程序数据共享的东西”进行通信
附言

我不能用otto,因为markdown不在那里运行

实际代码:

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)