Node.js nodejs:侦听EACCES:权限被拒绝0.0.0.0:80

Node.js nodejs:侦听EACCES:权限被拒绝0.0.0.0:80,node.js,https,socket.io,Node.js,Https,Socket.io,我正在尝试创建https服务器来测试节点js的套接字io。根据 我创建了privatekey.pem和certificate.pem,这是我的代码: var express = require('express'); var https = require('https'); var fs = require('fs'); var options = { key: fs.readFileSync('privatekey.pem'), cert: fs.readFileSync

我正在尝试创建https服务器来测试节点js的套接字io。根据

我创建了
privatekey.pem
certificate.pem
,这是我的代码:

var express = require('express');
var https = require('https');
var fs = require('fs');

var options = {
    key: fs.readFileSync('privatekey.pem'),
    cert: fs.readFileSync('certificate.pem')
  };
var app = express();

 var server = https.createServer(options, app).listen(443);

var io = require('socket.io').listen(server,()=>{
    console.log('listen to https');
});



io.on('connection', function (socket) {
    console.log(' user connected');
    socket.on('disconnect', function () {
        console.log('a user disconnected');
    });
});
但在运行服务器后,我出现以下错误:

tazik@mx:/mnt/Projects/Projects/nodejs/socketserver
$ node app.js 
events.js:288
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES: permission denied 0.0.0.0:80
    at Server.setupListenHandle [as _listen2] (net.js:1292:21)
    at listenInCluster (net.js:1357:12)
    at Server.listen (net.js:1445:7)
    at Object.<anonymous> (/mnt/Projects/Projects/nodejs/socketserver/app.js:15:24)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47
Emitted 'error' event on Server instance at:
    at emitErrorNT (net.js:1336:8)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  code: 'EACCES',
  errno: 'EACCES',
  syscall: 'listen',
  address: '0.0.0.0',
  port: 80
}
tazik@mx:/mnt/Projects/Projects/nodejs/socketserver
$node app.js
events.js:288
投掷者;//未处理的“错误”事件
^
错误:侦听EACCES:权限被拒绝0.0.0.0:80
在Server.setupListenHandle[as _listen2](net.js:1292:21)
在ListeniCluster(net.js:1357:12)
在Server.listen(net.js:1445:7)
反对。(/mnt/Projects/Projects/nodejs/socketserver/app.js:15:24)
at模块编译(内部/modules/cjs/loader.js:1158:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:1178:10)
at Module.load(内部/modules/cjs/loader.js:1002:32)
at Function.Module._load(内部/modules/cjs/loader.js:901:14)
在Function.executeUserEntryPoint[作为runMain](internal/modules/run_main.js:74:12)
在internal/main/run_main_module.js:18:47
在以下位置的服务器实例上发出了“错误”事件:
在emitErrorNT(net.js:1336:8)
在处理和拒绝时(内部/process/task_queues.js:84:21){
代码:'EACCES',
errno:‘EACCES’,
syscall:'listen',
地址:“0.0.0.0”,
港口:80
}

我正在使用linux mx。

我相信您需要root权限才能在1024以下的端口上运行

sudo node app.js
如果您没有sudo帐户,请尝试使用其他端口,例如8080和4433。

非特权用户(非root用户)无法在1024以下的端口上打开侦听套接字

sudo node app.js
检查

授予安全用户使用端口80的权限

请记住,我们不希望以root用户身份运行您的应用程序, 但有一个问题:您的安全用户没有使用权限 默认的HTTP端口(80)。您的目标是能够发布 访问者可以通过导航到易于使用的URL(如 http://ip:port/

不幸的是,除非您以root用户身份登录,否则通常必须使用 像这样的URLhttp://ip:port -其中端口号>1024

很多人被困在这里,但解决办法很简单。有一些 但这是我喜欢的。键入以下命令:

> sudo apt-get install libcap2-bin 
> sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\`` 
现在,当您告诉一个节点应用程序 如果您希望它在端口80上运行,它不会抱怨

EDIT:在
setcap
命令中添加一个空格

var server = https.createServer(options, app); // Creating a server
var io = require('socket.io').listen(server); // Mapping socket with server

server.listen(8443,() => { // setting port for existing server
    console.log('Https listening'); // Now socket and server both listens to same port
});

server.listen
中,第一个参数必须是端口,然后是主机名:

server.listen(port , hostname , () => 
    console.log('server started'); 
});

我认为Apache正在使用端口80,所以请确保端口没有冲突(如果您的系统上有Apache)?对于Windows。。在这里,我正在删除端口号:1024并正常工作:)当我执行您的建议时,我希望打印
console.log('listentohttps')但什么都没有发生@huytc@sayreskabir控制台上是否打印了任何内容?没有打印任何内容:@huytc@sayreskabir移动此部分
//创建一个HTTP服务。var io=require('socket.io').listen(服务器,()=>{console.log('listen to https');})下面
var服务器=…
。删除此行:
var io=require('socket.io')。侦听(服务器)
@sayreskabir
https.createServer(…).listen(…)
不返回服务器,因此您的代码无法工作。试试这个:当我做你的建议时,我希望打印console.log('listentohttps');但是什么也没有发生。我觉得我的代码有点不对劲@sohanI我正在努力理解你上面的代码,你从哪里开始使用
http
端口服务。我只能看到使用了
https
。你能把代码清理一下吗@sayreskabirI建议你遵循这个。和。我认为您没有使用
html
服务您的请求,并且没有创建套接字。因为在使用express时,有一些特定的步骤显示,当客户端加入时,您是否通知服务器,您是否正在执行类似的操作,`var socket=io.connect(');on('connect',function(data){socket.emit('join','helloworld fromclient');})`@奇普图斯啊,哇,太明显了。我应该意识到这一点。谢谢