在bash脚本中使用进程替换时,节点无法找到模块

时间:2016-09-16 13:59:57

标签: javascript node.js bash

我有一个命令,我通常会在POST /dmanager/v5/updateprofile/ HTTP/1.1 Host: host.com Content-Type: application/json Authorization: Basic aHNoc25hbmE4MjMxOmpzanNqc2pzampz Cache-Control: no-cache Postman-Token: 23a32222-db02-b8bb-63cb-da5faffc27be {"age":23,"phone_number":"","user_id":19709,"weight":25,"key":"jsjsjsjsjjs","set_first_login":"true","first_name":"Suisse","height":91.44,"last_name":"","email":"hshsnana@jsjsja.com","gender":"M"} 的{​​{1}}部分运行,但问题是scripts使用package.json,它不支持过程替代。

我需要进程替换,因为我想将args传递给npm run的结果,而不能用管道来做。

所以我编写了以下脚本:

sh

现在的问题是,当我使用进程替换时,节点无法找到已安装的模块。在运行flow-remove-types index.js的case语句中使用#!/bin/bash PATH=./node_modules/.bin:$PATH case $1 in start) node <(flow-remove-types index.js) ${@:2} ;; works) flow-remove-types index.js | node ;; esac 命令运行在查找模块时没有问题,但是当我运行带有进程替换的命令works时。我得到以下堆栈跟踪

flow-remove-types index.js | node

有谁知道为什么会这样?为什么节点无法访问start中安装的模块。

1 个答案:

答案 0 :(得分:1)

我的猜测是,当你跑步时:

flow-remove-types index.js | node

然后node尝试在当前工作目录中找到node_modules目录,因为它不知道脚本的位置 - 它通过STDIN获取。

但是当你跑步时:

node <(flow-remove-types index.js)

然后node不会在STDIN上获取脚本,而是在像/dev/fd/63这样的文件中获取脚本,并将其文件名作为命令行参数。

尝试此操作以查看评估结果:

echo node <(flow-remove-types index.js)

然后它可能会尝试在node_modules中找到/dev/fd目录,但它不存在。

也许运行这样的东西会有所帮助:

NODE_PATH=`pwd`/node_modules node <(flow-remove-types index.js)

我无法测试它因为我跑步:

node <(cat app.js)
即使app.js不需要任何模块,

也不起作用。