如何使用 Node.js 构建安全服务器并使用 Cloudinary 快速上传图像(上)

141 阅读5分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

前提

创建一个名为index.js.

在文件中,HTTP像这样要求模块:

  const http = require('http');

调用createServer()它的方法并将其分配给一个常量,如下所示:

  const server = http.createServer();

像这样调用listen()服务器常量上的方法:

  server.listen();

给它一个端口来监听。现在这可以是任何空闲端口,但我们将使用3000常规端口。所以我们有这个:

  const http = require('http');

  const server = http.createServer();

  server.listen(3000);

基本上,这就是创建服务器所需要做的一切。

如何测试服务器

在您的终端(应该在项目目录中)中,键入node index.js并点击Enter按钮。

在地址栏中打开新标签页postman或任何网页,然后键入并点击按钮。(我将使用邮递员,因为它具有开箱即用的扩展功能。)browser``http://localhost:3000/``Enter

您会注意到您的浏览器或邮递员会像这样无限期地加载:

邮递员无限期加载

耶!没事儿。我们的服务器已启动并正在运行。

但是已经很无聊了。我们需要让服务器与我们交谈。

让我们立即着手。

如何从服务器发回响应

回到代码中,将以下内容添加到const server = http.createServer();

 (request, response) => {
    response.end('Hey! This is your server response!');
 }

所以我们现在有:

  const http = require('http');

  const server = http.createServer((request, response) => {
    response.end('Hey! This is your server response!');
  });

server.listen(3000);

在基本术语中,request对象告诉server我们我们想要什么,response对象告诉我们server必须对我们说些什么request,并且end()方法终止与 的通信server response

希望这是有道理的!

现在,按照我们上面概述的步骤再次测试服务器,您的服务器应该正在与您交谈。这是我的输出:

邮递员返回响应

随意更改字符串。

用于Control/Command + C终止服务器并运行node index以再次启动服务器。

看起来很锋利!对?都好...

如何使用 Express 创建节点服务器

在本节中,我们希望通过使用Expressand Nodemon(node-mon 或 no-demon,发音随意)让我们的生活更轻松。

在终端中,安装以下内容:

npm install express --save 
npm install nodemon --save-dev

创建一个名为app.js或任何适合您的新文件

在文件中,

  1. 像这样要求快递:

const express = require('express');

  1. 将 express 方法分配给一个常量,如下所示:

const app = express();

  1. 导出 app 常量,使其可用于目录中的其他文件,如下所示:

module.exports = app;

所以我们有:

const express = require('express');

const app = express();



module.exports = app;

index.js文件中,要求app我们刚才导出的:

const app = require('./app');

接下来,使用应用程序设置端口,如下所示:

app.set('port', 3000);

http.createServer()并将方法中的代码替换为app如下所示:

const server = http.createServer(app);

这会将所有 API 管理定向到app.js有助于分离关注点的文件。

所以我们的index.js文件现在看起来像这样:

const http = require('http');
const app = require('./app');

app.set('port', 3000);
const server = http.createServer(app);

server.listen(3000);

回到我们的app.js文件,因为我们已经将所有 API 管理都指向它,让我们创建一个端点来像以前一样与我们对话。

所以在 之前module.exports = app,添加以下代码:

app.use((request, response) => {
   response.json({ message: 'Hey! This is your server response!' }); 
});

我们现在有:

const express = require('express');

const app = express();

app.use((request, response) => {
   response.json({ message: 'Hey! This is your server response!' }); 
});

module.exports = app;

啊……是时候测试我们的应用了。

为了测试我们的应用程序,我们现在输入nodemon index我们的终端并点击Enter按钮。这是我的终端:

终端运行 nodemon

您是否注意到 nodemon 与 Node 不同,它为我们提供了在终端中执行的详细信息?这就是nodemon的美妙之处。

您现在可以转到postman或任何browser地址栏中,键入http://localhost:3000/并点击Enter。查看我的输出: 邮递员从快递应用程序返回响应

哇!它正在工作。

现在有更多使用 nodemon 的理由。转到app.js文件并将message字符串更改为您选择的任何字符串,保存并观看terminal.

nodemon在更改后重新启动

哇...它会自动重新启动服务器。这对于 Node 来说是不可能的。我们不得不自己重新启动服务器。

如何保护服务器并使其永不过时

index.js文件中,将所有代码替换为以下内容:

const http = require('http');
const app = require('./app');

const normalizePort = val => {
  const port = parseInt(val, 10);

  if (isNaN(port)) {
    return val;
  }
  if (port >= 0) {
    return port;
  }
  return false;
};
const port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

const errorHandler = error => {
  if (error.syscall !== 'listen') {
    throw error;
  }
  const address = server.address();
  const bind = typeof address === 'string' ? 'pipe ' + address : 'port: ' + port;
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges.');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use.');
      process.exit(1);
      break;
    default:
      throw error;
  }
};

const server = http.createServer(app);

server.on('error', errorHandler);
server.on('listening', () => {
  const address = server.address();
  const bind = typeof address === 'string' ? 'pipe ' + address : 'port ' + port;
  console.log('Listening on ' + bind);
});

server.listen(port);

process.env.PORT使应用程序动态化,以便将来在实时服务器上托管时可以运行分配给它的任何端口。

normalizePort函数返回一个有效端口,无论是作为数字还是字符串提供。

errorHandler函数检查各种错误并适当地处理它们——然后将其注册到服务器。

还注册了一个listening事件侦听器,将运行服务器的端口或命名管道记录到控制台。

哟!我们的服务器现在更加安全和强大。请注意,nodemon 还显示了我们正在侦听的端口。

有了它,一个简单、安全且健壮的 Node.js 服务器。