我有一个Web服务器,可以读写磁盘上的数据文件.我想只在一个Web请求中写入一个文件.
这是一个示例程序,说明了我的问题.它将状态文件保存在"/tmp/rw.txt"中,并在每次Web命中时增加整数内容.运行此程序,然后运行类似的程序ab -n 10000 -c 1000 http://localhost:3000/,表明通过多次点击从文件中读取相同的值,并且它被多次写入.
注意:我知道flock()和fs-ext.但是,flock()会将文件锁定到当前进程; 因为这里的所有访问都在同一个进程中,所以flock()不起作用(并且大大复杂化了这个例子).
另请注意,我通常使用express,async等来完成大部分工作; 为了举例,只是坚持基础.
var http = require("http"),
fs = require("fs");
var stateFile = "/tmp/rw.txt";
var server = http.createServer(function(req, res) {
var writeNum = function(num) {
var ns = num.toString(10);
console.log("Writing " + ns);
fs.writeFile(stateFile, ns, function(err) {
if (err) {
res.writeHead(500, {"Content-Type": "text/plain"});
res.end(err.message);
} else {
res.writeHead(200, {"Content-Type": "text/plain"});
res.end(ns);
}
});
};
switch (req.url) {
case "/reset":
writeNum(0);
break;
case "/":
fs.readFile(stateFile, function(err, data) {
if …Run Code Online (Sandbox Code Playgroud) 我试图将请求的二进制体写入文件并失败.该文件是在服务器上创建的,但我无法打开它.我在Ubuntu上收到'致命错误:不是png'.以下是我提出请求的方式:
curl --request POST --data-binary "@abc.png" 192.168.1.38:8080
Run Code Online (Sandbox Code Playgroud)
以下是我试图用文件保存它的方法.第一个片段是用于将所有数据附加在一起的中间件,第二个是请求处理程序:
中间件:
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf-8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function() {
next();
});
});
Run Code Online (Sandbox Code Playgroud)
处理器:
exports.save_image = function (req, res) {
fs.writeFile("./1.png", req.rawBody, function(err) {
if(err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
res.writeHead(200);
res.end('OK\n');
};
Run Code Online (Sandbox Code Playgroud)
这里有一些可能有用的信息.在中间件中,如果我记录rawBody的长度,它看起来是正确的.我真的很困惑如何正确保存文件.我所需要的只是朝着正确的方向努力.
我在我的节点中收到以下错误,无法弄清楚原因:
TypeError: Bad arguments
at Object.fs.readFileSync (fs.js:277:11)
at getSeries (/Users/user/tv/final.js:57:16)
at /Users/user/tv/final.js:89:4
at /Users/user/tv/node_modules/async/lib/async.js:610:21
at /Users/user/tv/node_modules/async/lib/async.js:249:17
at iterate (/Users/user/tv/node_modules/async/lib/async.js:149:13)
at /Users/user/tv/node_modules/async/lib/async.js:160:25
at /Users/user/tv/node_modules/async/lib/async.js:251:21
at /Users/user/tv/node_modules/async/lib/async.js:615:34
at /Users/user/tv/final.js:86:4
Run Code Online (Sandbox Code Playgroud)
我很确定它与我使用的异步npm软件包无关,因为我在开始使用之前遇到了同样的错误.
这是代码:
function getSeries() {
JSON.parse(fs.readFileSync('updates.json', function(err,data) {
if (err) {
console.error(err);
}
else {
var json = data;
}
}));
Run Code Online (Sandbox Code Playgroud) 我有一个Windows-1255(希伯来语)编码的文件,我希望能够在Node.js中访问它.
我尝试打开文件fs.readFile,它给了我一个Buffer我无法做任何事情.我尝试将编码设置为Windows-1255,但是无法识别.
我也检查了windows-1255包,但我无法解码,因为fs.readFile要么给出一个Buffer或一个UTF8字符串,并且包需要一个1255编码的字符串.
如何读取Windows-1255Node.js中的-encoded文件?
我刚刚遇到fs读取文件的奇怪问题.
我从部署管理器(strongloop strong-pm)运行节点应用程序作为以下用户"strong-pm".
无论我给文件赋予什么权限,我都试图打开节点应用程序,我明白了
return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
worker:1 Error: EACCES, permission denied '/root/my_dir/file.txt'
at Object.fs.openSync (fs.js:432:18)
at Object.fs.readFileSync (fs.js:286:15)
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一切:
sudo chown -R strong-pm:strong-pm /root/my_dir
sudo chmod -R 777 /root/my_dir
sudo chmod 777 /root/my_dir/file.txt
将strong-pm
添加到组中,然后将该组添加到目录中......
仍然没有运气..任何想法?
谢谢!
系统:DigitalOcean上的Ubuntu 14.04 x64
我用CasperJS编写了一个web抓取脚本,它在Mac OS 10.10.4上完美运行,CasperJS版本1.1.0-beta3和PhantomJS版本1.9.8,但当我在我的一台服务器上放置相同的脚本时,就是Ubuntu 14.04(在具有相同环境(CasperJS和PhantomJS所有相同版本)的Docker容器内运行时,它突然输出:
我是`fs`模块
这很奇怪.我的一个建议是,在这个脚本中我也试图要求其他一些需要的脚本:
var parsingStrategy = require(strategiesPath + strategyName);
Run Code Online (Sandbox Code Playgroud)
并且这些策略的路径是正确的我已经检查过了.我在这个脚本中所做的所有其他事情都只是正常的CasperJS内容,我认为这些内容已经记录并且运行良好.
在我的服务器上,每次用户使用我们的服务时,我们都必须从服务器获取它们的JSON文件.我通过使用fs.createReadStream()我自己的函数来做到这一点.
function getJSONFromServer(filepath, callback){
var data = fs.createReadStream(filepath);
data.on('error', function (error) {
console.log("Caught", error);
callback(undefined, error);
});
var jsonFile = "";
data.on('data', function(chunk) {
jsonFile += chunk;
});
data.on('end', function() {
var jsonData = JSON.parse(jsonFile);
callback(jsonData);
data.destroy();
data.close();
});
}
Run Code Online (Sandbox Code Playgroud)
这样做,但它不会关闭与文件的连接.因此,在读取1024个文件(我的服务器上的限制)后,Node.js将产生错误EMFILE, too many open files.然后我必须杀死我们的Node.js服务器,再次打开它,这将清除"打开文件".
我检查打开的文件数量lsof -i -n -P | grep nodejs.它显示如下:
nodejs 13707 node 10u IPv4 1163695 0t0 TCP 127.0.0.1:55643->127.0.0.1:27017 (ESTABLISHED)
nodejs 13707 node 11u IPv4 1163697 0t0 TCP 127.0.0.1:55644->127.0.0.1:27017 (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)
对于任何打开的文件.
我尝试过使用graceful-fs.我试着打电话 …
如何在节点js FS模块中使用Typescript async/await函数并返回typescript默认promise,并在promise解析后调用其他函数.
以下是代码:
if (value) {
tempValue = value;
fs.writeFile(FILE_TOKEN, value, WriteTokenFileResult);
}
function WriteTokenFileResult(err: any, data: any) {
if (err) {
console.log(err);
return false;
}
TOKEN = tempValue;
ReadGist(); // other FS read File call
};
Run Code Online (Sandbox Code Playgroud) 我可以打电话
fs.readdirSync("C:\\", { withFileTypes: true })
Run Code Online (Sandbox Code Playgroud)
并获得数组fs.Dirent,但它们看起来像
> fs.readdirSync("C:\\", { withFileTypes: true })[32]
Dirent { name: 'Windows', [Symbol(type)]: 2 }
> fs.readdirSync("C:\\", { withFileTypes: true })[21]
Dirent { name: 'pagefile.sys', [Symbol(type)]: 1 }
> fs.readdirSync("C:\\", { withFileTypes: true })[10]
Dirent { name: 'Documents and Settings', [Symbol(type)]: 3 }
Run Code Online (Sandbox Code Playgroud)
所以有一个名称和类型,但类型隐藏在 Symbol(type) 下,我找不到任何信息如何从那里获取它。
当然,我可以使用像
> x = fs.readdirSync("C:\\", { withFileTypes: true })[10]
Dirent { name: 'DoYourData iCloud Backup', [Symbol(type)]: 2 }
> x[Object.getOwnPropertySymbols(x)[0]]
3
Run Code Online (Sandbox Code Playgroud)
但这似乎很奇怪。
如果它是出于目的而隐藏的,并且除了名称之外没有任何公共内容,那么我不明白为什么我们在选项中使用特殊标志来获取对象而不是简单的字符串。
请帮忙
我从客户端接收图像并将其保存在文件系统中的服务器上并处理此图像,然后我需要将其上传到 firebase 存储
我尝试在异步函数中从 Node.js 上传图像文件到 firebase 存储
const path = process.cwd() + '/my_image.jpg';
const file = readFileSync(path);
await firebase.storage().ref().child('my_image.jpg').put(file);
...
Run Code Online (Sandbox Code Playgroud)
但我有错误
第一个参数必须是字符串类型或 Buffer 的实例。接收到一个 Uint8Array 的实例
好吧,我尝试二进制格式
const path = process.cwd() + '/my_image.jpg';
const file = readFileSync(path, { encoding: 'base64' });
await firebase.storage().ref().child('my_image.jpg').putString(file, 'base64');
...
Run Code Online (Sandbox Code Playgroud)
我得到错误
Firebase 存储:字符串与格式“base64”不匹配:找到无效字符”
我已经尝试了很多东西,但没有任何效果!我究竟做错了什么?
fs ×10
node.js ×9
javascript ×6
binary-data ×1
casperjs ×1
filesystems ×1
firebase ×1
flock ×1
hebrew ×1
module ×1
permissions ×1
phantomjs ×1
promise ×1
require ×1
typescript ×1
ubuntu ×1