2016-10-01 81 views
0

我知道這種問題已經存在,但他們的答案並沒有糾正我的問題。NodeJS - TypeError:app.listen不是函數

錯誤是「TypeError:app.listen不是函數」;

我的完整代碼如下,在此先感謝。 (PS,我沒有在同一端口上運行任何東西)

var io = require('socket.io')(app); 
var fs = require('fs'); 
var serialPort = require("serialport"); 

var app = require('http'); 

app.createServer(function (req, res) { 
    fs.readFile(__dirname + '/index.html', 
     function (err, data) { 
      res.writeHead(200); 
      res.end(data); 
     }); 
}).listen(1337, '127.0.0.1'); 


var port = new serialPort(process.platform == 'win32' ? 'COM3' : '/dev/ttyUSB0', { 
    baudRate: 9600 
}); 

port.on('open', function() { 
    console.log('stream read...'); 
}); 

port.on('end', function() { 
    console.log('stream end...'); 
}); 

port.on('close', function() { 
    console.log('stream close...'); 
}); 

port.on('error', function(msg) { 
    console.log(msg); 
}); 

port.on('data', function(data) { 
    console.log(data); 

    var buffer = data.toString('ascii').match(/\w*/)[0]; 
    if(buffer !== '') bufferId += buffer; 

    clearTimeout(timeout); 
    timeout = setTimeout(function(){ 
     if(bufferId !== ''){ 
      id = bufferId; 
      bufferId = ''; 
      socket.emit('data', {id:id}); 
     } 
    }, 50); 
}); 

io.on('connection', function (socket) { 
    socket.emit('connected'); 
}); 

app.listen(80); 
+0

嗨Adeneo,我是相當新的的NodeJS,請解釋一下你的意思? –

+0

我剛剛有點困惑,你在第一行使用'app',在那裏你將它傳遞給socket.io,但是它沒有被定義,直到第五行? – adeneo

+0

在文檔中有一些例子,你是否嘗試過 - > https://nodejs.org/api/http.html#http_event_connect – adeneo

回答

2

錯誤來自這一行:

app.listen(80); 

由於應用程序是你的http模塊var app = require('http');,你試圖聽節點http模塊(以及你不能)。你需要用這個http模塊創建一個服務器,然後聽取它。

這是你與那些線做了什麼:

app.createServer(function (req, res) { 
    fs.readFile(__dirname + '/index.html', 
     function (err, data) { 
      res.writeHead(200); 
      res.end(data); 
     }); 
}).listen(1337, '127.0.0.1'); 

基本上,http.createServer()返回一個http.server實例。這個實例有一個listen方法,它使服務器接受指定端口上的連接。

所以這可以工作:

var app = require('http'); 
app.createServer().listen(8080); 

這不可能:

var app = require('http'); 
app.listen(8080); 

HTTP模塊文件:https://nodejs.org/api/http.html#http_http_createserver_requestlistener

+0

你我的朋友真棒!這對我很有用,非常感謝。 –

0

清除掉所有你必須有代碼,並嘗試

const http = require('http'); 
const handleRequest = (request, response) => { 
    console.log('Received request for URL: ' + request.url); 
    response.writeHead(200); 
    response.end('Hello World!'); 
}; 

const www = http.createServer(handleRequest); 
www.listen(8080); 

然後訪問本地主機:8080 ...看到一個響應到頁面。

但是,如果你要處理頁面的路由,我建議使用expressjs一開始click here for guides 一旦這個工作,你就可以添加你socket.io代碼回到

1

這也許不是一個答案,以SO問題,但在與類似的情況test同樣的錯誤「TypeError:app.listen不是函數」可能可以通過導出模塊0123來解決。

$ ./node_modules/.bin/mocha test 

可以輸出

TypeError: app.listen is not a function 

解決方案:

嘗試增加了server.js文件的底部:

module.exports = app;