node入门开发遇到的问题

最近在看node入门这本书,https://cnodejs.org/getstart

里面是跟随作者完成一个小的demo,书中不免会有遗漏的,下面是我在实现里面最后一个例子时遇到的问题,希望能够帮助其他人。

先来看看整体的代码:

index.js

/**
 * Created with IntelliJ IDEA.
 * User: Administrator
 * Date: 15-4-18
 * Time: 下午6:08
 * To change this template use File | Settings | File Templates.
 */
var server = require("./server.js");
var router = require("./router.js");
var requestHandlers = require("./requestHandlers");

var handle ={};
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;
handle["/show"] = requestHandlers.show;

server.start(router,handle);

server.js

/**
 * Created with IntelliJ IDEA.
 * User: Administrator
 * Date: 15-4-18
 * Time: 下午5:08
 * To change this template use File | Settings | File Templates.
 */
var http = require("http");
var url = require("url");

function start(route,handle){
    function onRequest(request,response){
        var postData = "";
        var path = url.parse(request.url).pathname;
        console.log("Request for"+path+" received");
        route.route(handle,path,response,request);
        /*request.addListener("data",function(postDataChunk){
           postData += postDataChunk;
            console.log("Receive post data chunk ‘"+postDataChunk+"‘.");
        });

        request.addListener("end",function(){
            route.route(handle,path,response,postData);
        });*/
    }
    http.createServer(onRequest).listen(8888);
    console.log("Server has started.");
}

exports.start = start;

router.js

/**
 * Created with IntelliJ IDEA.
 * User: Administrator
 * Date: 15-4-18
 * Time: 下午6:49
 * To change this template use File | Settings | File Templates.
 */
 function route(handle,pathname,response,request){

     console.log("About to route a request for"+pathname);
    if(typeof handle[pathname] === ‘function‘)
    {
        handle[pathname](response,request);
    } else{
        console.log("No request handler found for"+pathname);
        response.writeHead(404,{"Content-Type":"text/plain"});
        response.write("404 NOT found");
        response.end();
    }
}
exports.route = route;

requestHandlers.js

/**
 * Created with IntelliJ IDEA.
 * User: Administrator
 * Date: 15-4-18
 * Time: 下午8:38
 * To change this template use File | Settings | File Templates.
 */
var exec = require("child_process").exec();
var querystring = require("querystring"),
    fs = require("fs"),
    util = require(‘util‘),
    formidable = require("formidable");

function start(response,request)
{
    console.log("Request handler ‘start‘ was called");

    var body = ‘<html>‘+
        ‘<head>‘+
        ‘<meta http-equiv="Content-Type" ‘+
        ‘content="text/html; charset=UTF-8" />‘+
        ‘</head>‘+
        ‘<body>‘+
        ‘<form action="/upload" enctype="multipart/form-data" ‘+
        ‘method="post">‘+
        ‘<input type="file" name="upload">‘+
        ‘<input type="submit" value="Upload file" />‘+
        ‘</form>‘+
        ‘</body>‘+
        ‘</html>‘;

    response.writeHead(200,{"Content-Type":"text/html"});
    response.write(body);
    response.end();
}

function upload(response,request)
{
    console.log("Request handler ‘upload‘ was called");
    var form = new formidable.IncomingForm();
    console.log("about to parse");
    form.parse(request, function(error, fields, files) {
        console.log("parsing done");
        var readStream = fs.createReadStream(files.upload.path);
        var writeStream = fs.createWriteStream("/tmp/test.png");

        util.pump(readStream, writeStream, function() {
            fs.unlinkSync(files.upload.path);
        });
        response.writeHead(200, {"Content-Type": "text/html"});
        response.write("received image:<br/>");
        response.write("<img src=‘/show‘/>");
        response.end();
    });
}

function show(response,request)
{
   console.log("Request handler ‘show‘ was called.");
    fs.readFile("/tmp/test.png","binary",function(error,file){
        if(error){
            response.writeHead(500,{"Content-Type":"text/plain"});
            response.write(error+"\n");
            response.end();
        } else{
            response.writeHead(200,{"Content-Type":"image/png"});
            response.write(file,"binary");
            response.end();
        }
    });
}

exports.start = start;
exports.upload = upload;
exports.show = show;

接下来来看一下遇到的问题:

1、在使用指令

npm install formidable

你会发现在运行后,控制台会输出

但是在npm(包管理器)并没有找到这个module,运行代码时报错Error: Cannot find module ‘formidable‘,这就是包没有引用到。

解决办法是:

打开cmd,使用cd命令切换到你当前项目所在目录,然后再执行“npm install formidable”,项目目录下面就会生成一个node_modules子目录,里面是安装好了的formidable模块。现在运行你写好的代码, 不会再提示“Cannot find module ‘formidable‘”了。

2、按照书上的运行的时候出现了这个错误:

看报错的原因就是在重命名的时候有问题,原来就是node在跨分区重命名文件,会有权限问题。http://www.crifan.com/node_js_use_fs_renamesync_error_exdev_cross_device_link_not_permitted/作者给出了解决方法。这样就可以完美的运行了。。。

时间: 2024-08-03 14:52:38

node入门开发遇到的问题的相关文章

Node.js开发入门—语音合成示例

出于项目需要,搞了一个语音合成(TTS)的小示例,使用的是OKVoice. 我想在PC上测试,OKVoice的快速接入API可以实现我的目的,文档在这里:http://dev.okvoice.com/file.php. 直接上代码吧,okVoiceTts.js,内容如下: var http = require('http'); var fs =require('fs'); var crypto = require('crypto'); var util = require('util'); va

Node.js开发入门—使用对话框ngDialog

做网站经常会遇到弹出对话框获取用户输入或弹出对话框让用户确认某个操作之类的情景,有一个基于AngularJS的扩展模块可以帮我们优雅地完成这类事情:ngDialog. ngDialog在github上提供了一个示例网页,演示了它的各种用法,在这里:https://github.com/likeastore/ngDialog/blob/master/example/index.html.ngDialog的github主页的readme也对常用的指令和服务做了较为详细的介绍,可以参考.我这篇就纯粹是

Node.js开发入门—Stream用法详解

Stream是Node.js中非常重要的一个模块,应用广泛.一个流是一个具备了可读.可写或既可读又可写能力的接口,通过这些接口,我们可以和磁盘文件.套接字.HTTP请求来交互,实现数据从一个地方流动到另一个地方的功能. 所有的流都实现了EventEmitter的接口,具备事件能力,通过发射事件来反馈流的状态.比如有错误发生时会发射"error"事件,有数据可被读取时发射"data"事件.这样我们就可以注册监听器来处理某个事件,达到我们的目的. Node.js定义了R

Node.js开发入门—Angular简单示例

在"使用AngularJS"中,我们提到了如何在Node.js项目中引入AngularJS,这次提供一个非常简单的示例,演示AngularJS里的指令.数据绑定.服务等内容. 我准备做Web后台管理系统,不同的管理员会有不同的权限,管理员登录后看到的菜单和他的权限有关,能看到什么,是动态生成的(类似RBAC).本文的示例从这个项目而来,当然,现在还是最简单的. 如果没有特别说明,后面我们用到的示例都使用express generator生成. Angular小demo 先搞起来吧. 第

Node.js开发入门—UDP编程

Node.js也提供了UDP编程的能力,相关类库在"dgram"模块里. 与TCP不同,UDP是无连接的,不保障数据的可靠性,不过它的编程更为简单,有时候我们也需要它.比如做APP的统计或者日志或者流媒体,很多流媒体协议都会用到UDP,网上一搜一大堆. 使用UDP,如果你要发送数据,只需要知道对方的主机名(地址)和端口号,扔一消息过去即可.至于对方收不收得到,听天由命了.这就是数据报服务,类似快递或邮件. 我们这次来介绍一下Node.js里的UDP编程,我会提供一个UDP版本的echo

Node.js开发入门—使用http访问外部世界

Node.js的http模块,不但可以构建服务器,也可以作为客户端类库来访问别的服务器.关键就在两个方法: http.request(options[,callback]) http.get(path[,callback]) 除了http,还会用到FileSystem模块和Stream中的stream.Readable和stream.Writable. 先来大概介绍一下相关API吧. API解释 http.request()方法接受一个options参数,这个参数可以是对象,用来指明你要访问的网

Node.js开发入门—套接字(socket)编程

Node.js的net模块提供了socket编程接口,方便我们利用较为底层的套接字接口来实现应用协议.这次我们看一个简单的回显服务器示例,包括服务端和客户端的代码. 使用JavaScript也可以进行套接字编程,哈哈,这酸爽! 代码 分服务器和客户端两部分来说吧. echoServer代码分析 echoServer.js: var net = require("net"); // server is an instance of net.Server // sock is an ins

Node.js开发入门—notepad++ for Node.js

对于Node.js开发,论IDE的话,Webstorm是不二的选择,但它是收费的(可免费使用30天).一开始,我们先将就一下,使用notepad++来编写Node.js应用.这样做还有一大好处:没有关于Node.js的代码高亮和自动补全,可以更好地敦促我们使用在线API文档记忆各种类库API.死磕自己吧,enjoy it. notepad++的安装与配置 到"https://notepad-plus-plus.org/download/v6.8.2.html"这里下载吧,6.8.2版本

Node.js开发入门—使用AngularJS内置服务

在上一篇,"AngularJS简单示例"中演示了一个非常简单的使用Angular的小demo,那篇已经太长,原本要介绍的一些内容只好单另开篇了.这些内容,就是如何使用Angular服务. 我们还是基于"AngularJS简单示例"中的示例来改造一下.新的示例,能从Node.js+Express构造的服务器上获取管理菜单.为了实现这个,需要做几部分改造: 服务器提供adminMenu的下载功能,需要修改app.js,处理路由 修改Angular实现的控制器x-cont