EBADF, read
nodejs读取文件出的一个错误,解决不了,自己技术还达不到,解决不了这么高深的问题。
描述:需要记录访问的人数,每个人随机到的酒。打算用json文件来存储:read count write count; read user write user,结果出现了如下问题。
网上能找到的相关答案:http://www.tuicool.com/articles/2Qn2Un
以后的打算:
1、尽量避免用file来存储,需要频繁并发访问的数据;
2、nodejs一出错就挂了,所以需要好好研究下异常处理
错误提示:
events.js:85
throw er; // Unhandled 'error' event
^
Error: EBADF, read
at Error (native)
错误代码:
var express = require('express');
var router = express.Router();
var fs = require('fs');
var path = require('path');
var util = require('util');
var wine_data = [
{
"name":"熊猫精酿生姜金色艾尔",
"money":50,
"reason":"暖心向,极品云备胎",
"reason-1":"备胎不易。赏50元,来熊猫精酿喝杯",
"reason-2":"别暖了TA,冷了自己",
"href":"http://weidian.com/item.html?itemID=1623850670&wfr=wx&from=singlemessage&isappinstalled=1",
"image":"shengjiang.png"
}
];
function selectResult(ran, res, uname){
if(ran < 3){
res.render('result', {
uname: uname,
wname: wine_data[ran].name,
reason: wine_data[ran].reason,
reason1: wine_data[ran]["reason-1"],
reason2: wine_data[ran]["reason-2"],
money: wine_data[ran].money,
href: wine_data[ran]["href"]
});
}else{
res.render('result-n', {
uname: uname,
wname: wine_data[ran].name,
reason: wine_data[ran].reason
});
}
}
/* GET home page. */
router.get('/', function(req, res, next) {
var count_path = path.join(process.cwd(), '/public/data/count.json');
fs.readFile(count_path, function(err, data){
if(err){
console.log('err:'+err);
}else{
// console.log('data:'+data);
}
var data_json = JSON.parse(data);
var count = data_json.count;
count++;
res.render('index', {
count:count
});
data_json.count = count;
fs.writeFile(count_path, JSON.stringify(data_json, function(key, value){return value;}, 4), function(err){
if(err){
console.log('add count fail:'+err);
}else{
// console.log('del success');
}
}); //writeFile end
}); //readFile end
});
router.get('/result', function(req, res, next) {
var user_path = path.join(process.cwd(), '/public/data/user.json');
var uname = req.query.uname;
fs.readFile(user_path, function(err, data){
if(err){
console.log('err:'+err);
}else{
// console.log('data:'+data);
}
var data_json = JSON.parse(data);
if(data_json[uname] !== undefined){
// 存在
var ran = +data_json[uname];
selectResult(ran, res, uname);
}else{
// 不存在
var ran = parseInt(data.length*Math.random());
data_json[uname] = ran;
selectResult(ran, res, uname);
fs.writeFile(user_path, JSON.stringify(data_json, function(key, value){return value;}, 4), function(err){
if(err){
console.log('add user fail:'+err);
}else{
// console.log('add user success');
}
}); //writeFile end
}// 是否存在 结束
}); //readFile end
});
module.exports = router;
EBADF, read的更多相关文章
- 根据linux内核源码查找recv返回EBADF(errno 9)的原因
linux的内核版本是2.6.18,x86_64. man里的解释是: EBADF The argument s is an invalid descriptor 我的模拟测试环境是: 前端loadr ...
- windows pm2 启动nodejs失败:Error: EBADF: bad file descriptor, uv_pipe_open
windows下打开命令窗口,安装pm2:npm install pm2 -g pm2成功安装,在项目目录下用pm2启动服务:pm2 start index.js,结果启动失败,错误如下: .pm2\ ...
- java.net.SocketException: recvfrom failed: EBADF (Bad file descriptor)
1. 问题说明: 与服务器之间进行socket通信的时候,客户端关闭socket之后,会抛出一个IOException,异常信息如下: java.net.SocketException: recvfr ...
- hadoop 2.7.3本地环境运行官方wordcount
hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...
- linux poll函数
poll函数与select函数差不多 函数原型: #include <poll.h> int poll(struct pollfd fd[], nfds_t nfds, int timeo ...
- Linux ERRNO
摘自Linux-3.18.20的头文件include/uapi/asm-generic/errno-base.h和include/uapi/asm-generic/errno.h: #define E ...
- Android中基于CGroup的memory子系统HAL层分析-lmkd
Android在内存管理上于Linux有些小的区别,其中一个就是引入了lowmemorykiller.从lowmemorykiller.c位于drivers/staging/android也可知道,属 ...
- 《UNIX环境高级编程》笔记——1.UNIX基础知识
这一章节侧重一些基本概念和书中用到的一些名词. 一.引言 所有的操作都提供服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储区以及获得当前时间等. 二.UNIX体系结构 其实linux常见 ...
- C++ 系列:socket 资料收集
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
随机推荐
- PAT 1012 数字分类 (20)(代码+测试点)
1012 数字分类 (20)(20 分) 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数的和: A2 = 将被5除后余1的数字按给出顺序进行交错求 ...
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 : ...
- mount重新挂载为写模式
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system mount -o remount,rw -t rootfs rootfs /
- Python配置工具类ConfigParser使用
ConfigParser模块定义了类ConfigParser,用于实现配置文件解释器.该模块ConfigParser在Python3中,已更名为configparser. 一,函数介绍 1.读取配置文 ...
- sleep()方法和yield()方法有什么区别?
两者都是Thread类的静态方法,定义如下 public static void sleep(long millis) throws InterruptedException public stati ...
- Java JMX 监管
Java JMX 监管 JSR 规范系列目录(https://www.cnblogs.com/binarylei/p/10348178.html) JMX(Java Management Extens ...
- Netty 源码 Channel(一)概述
Netty 源码 Channel(一)概述 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) Channel 为 Netty ...
- PHP网站记录
手把手教您搭建Apache下的PHP环境 http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%8E%A8%E8%8D%90/37371.sh ...
- mysql bigint ,int , smallint,tinyint 的范围
bigint 8字节 64位 int 4字节 32位 smallint 2字节 16位 tinyint 1字节8位 .. 范围 -128 到 127 , 如果是无符号 ,则返回 位 0-255 ...
- python 的文件操作
二进制用法 f=open('test.txt','wb') f.write("汉字\r\n".encode('UTF-8')) f.write("hello". ...