如何设置 Node、TypeScript 和 Express

TypeScript 是 JavaScript 的超集,提供了强类型支持,让开发者可以编写更安全、更健壮的代码。在本文中,我们将探讨如何将 TypeScript 与 Node.js 和 Express 一起使用,并构建一个简单的应用程序。

原文链接

前提条件

要完成本教程,你需要以下工具:

  • 安装了 Node.js(建议使用 v16 或更高版本)
  • 基本的 JavaScript 和 Node.js 知识

第一步:初始化项目

首先,我们需要创建一个新目录并初始化一个新的 Node.js 项目。在终端中运行以下命令:

mkdir node-ts-express
cd node-ts-express
npm init -y

这将创建一个新的 package.json 文件,默认设置所有值。接下来,我们将安装 TypeScript 和一些必要的依赖项。

第二步:安装 TypeScript 及其他依赖项

为了使用 TypeScript,我们需要安装 TypeScript 编译器和 Node.js 的类型定义:

npm install typescript ts-node @types/node --save-dev
  • typescript 是 TypeScript 编译器
  • ts-node 允许我们在 Node.js 中直接运行 TypeScript 文件,而无需手动编译
  • @types/node 包含 Node.js API 的类型定义

接下来,我们还需要安装 Express 和其类型定义:

npm install express
npm install @types/express --save-dev

第三步:配置 TypeScript

接下来,我们将设置 TypeScript 配置文件 tsconfig.json。在项目根目录下运行以下命令:

npx tsc --init

这个命令将在项目根目录中生成一个 tsconfig.json 文件。打开这个文件,确保以下选项被正确设置:

{
  "compilerOptions": {
    "target": "ES6",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true
  }
}
  • target 设置了编译后的 JavaScript 版本(在本例中为 ES6)
  • module 指定模块系统(在本例中为 CommonJS)
  • outDir 指定编译后文件的输出目录
  • rootDir 定义 TypeScript 源文件所在的目录
  • strict 启用严格的类型检查选项
  • esModuleInterop 允许兼容 CommonJS 和 ES 模块

第四步:创建 Express 服务器

现在,我们可以开始编写代码了。首先,创建一个 src 目录,并在其中创建一个名为 index.ts 的文件:

mkdir src
touch src/index.ts

index.ts 文件中,添加以下代码:

import express, { Request, Response } from 'express';

const app = express();
const PORT = 3000;

app.get('/', (req: Request, res: Response) => {
  res.send('Hello, TypeScript with Node.js!');
});

app.listen(PORT, () => {
  console.log(`Server is running at http://localhost:${PORT}`);
});

在这段代码中,我们导入了 Express 和类型定义,并创建了一个基本的 Express 服务器。服务器监听 3000 端口,并在根路由 / 返回一个简单的消息。

第五步:运行 TypeScript 应用程序

为了运行这个 TypeScript 应用程序,我们可以使用 ts-node 命令。运行以下命令:

npx ts-node src/index.ts

这将启动服务器,你可以在浏览器中访问 http://localhost:3000,并看到页面显示 "Hello, TypeScript with Node.js!"。

第六步:编译 TypeScript 代码

尽管 ts-node 非常方便,但在生产环境中,你通常会编译 TypeScript 代码为 JavaScript,然后运行编译后的代码。要编译 TypeScript 代码,运行以下命令:

npx tsc

这将编译 src 目录中的所有 TypeScript 文件,并将编译后的 JavaScript 文件输出到 dist 目录中。你可以通过以下命令运行编译后的应用程序:

node dist/index.js

总结

在本文中,我们介绍了如何在 Node.js 项目中设置 TypeScript,并使用 Express 创建了一个简单的服务器。TypeScript 提供的强类型检查和其他特性,使得它成为构建更大规模、复杂应用程序的理想选择。

你可以根据项目需求扩展此设置,添加更多的中间件、路由、控制器等。希望你在使用 TypeScript 构建 Node.js 应用时取得成功!

Nginx 配置与故障排查指南

1. 配置 Nginx 代理到特定端口

1.1 编辑 Nginx 配置文件

在 Nginx 的配置目录中创建或编辑一个配置文件,例如 /etc/nginx/conf.d/example.conf

sudo nano /etc/nginx/conf.d/example.conf

1.2 添加服务器块配置

在配置文件中添加以下内容,将请求代理到 8080 端口:

server {
    listen 80;
    server_name example.com;  # 替换为实际域名

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

1.3 验证并重新加载 Nginx 配置

验证配置文件的语法正确性:

sudo nginx -t

重新加载 Nginx 以应用更改:

sudo systemctl reload nginx

2. 配置 SSL/TLS 证书

2.1 安装 Certbot

根据你的系统安装 Certbot:

  • Ubuntu:

    sudo apt update
    sudo apt install certbot python3-certbot-nginx
    
  • CentOS/RHEL:

    sudo yum install epel-release
    sudo yum install certbot python3-certbot-nginx
    

2.2 生成证书

使用 Certbot 自动配置 Nginx:

sudo certbot --nginx -d example.com  # 替换为实际域名

2.3 验证证书

访问 https://example.com 并检查证书是否有效。你也可以使用 SSL Labs SSL Test 进行检测。

2.4 配置 Nginx 以使用 SSL/TLS

在 Nginx 配置文件中配置 SSL/TLS:

server {
    listen 80;
    server_name example.com;  # 替换为实际域名
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;  # 替换为实际域名

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-CBC-SHA256:ECDHE-RSA-AES256-CBC-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384';
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

2.5 重新加载 Nginx 配置

sudo systemctl reload nginx

3. 解决端口冲突问题

3.1 查找占用端口的进程

使用以下命令查找占用 443 端口的进程:

sudo netstat -tulnp | grep :443

或:

sudo ss -tulnp | grep :443

3.2 停止占用端口的进程

根据找到的进程 ID (PID),停止该进程:

sudo kill -9 <PID>

3.3 检查 Nginx 配置

确保没有多个 Nginx 配置文件试图监听相同的端口:

sudo grep -R "listen 443" /etc/nginx/

3.4 检查 Apache 配置(如果适用)

确认 Apache 配置文件中没有监听 443 端口:

sudo grep -R "Listen 443" /etc/httpd/

或:

sudo grep -R "Listen 443" /etc/apache2/

3.5 调整 Nginx 配置

如果需要,同时运行 Nginx 和其他服务时,可以调整 Nginx 配置文件中的端口号:

server {
    listen 8443 ssl;
    server_name example.com;  # 替换为实际域名

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-CBC-SHA256:ECDHE-RSA-AES256-CBC-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384';
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

3.6 重新启动相关服务

重启 Nginx 和其他相关服务:

sudo systemctl restart nginx
sudo systemctl restart apache2  # 如果你使用的是 Apache

3.7 检查系统状态

检查系统是否有其他端口冲突情况或资源争用问题:

sudo lsof -i :443

3.8 确认系统时间

确保服务器的系统时间准确:

date

总结

通过以上步骤,你可以配置 Nginx 以使用 SSL/TLS,并解决端口冲突问题。确保你的服务配置正确,证书有效,且端口未被其他进程占用。如果问题仍然存在,请详细检查错误日志并与相关支持团队联系获取进一步帮助。

在海外,寻找一个超越张一鸣的机会

作者:36氪编辑

近年来,中国科技公司在海外市场的表现令人瞩目。本文探讨了这些公司在全球扩展过程中面临的挑战与机遇,并分析了如何在国际市场上超越张一鸣(字节跳动创始人)的成功模式。

全球扩展的必要性

  • 市场饱和:随着国内市场的逐渐饱和,科技公司需要寻找新的增长点。
  • 多样化:进入国际市场可以减少对单一市场的依赖,提高抗风险能力。

挑战与机遇

文化差异

  • 理解与适应:公司需要深入理解并适应当地文化,避免文化冲突。
  • 本地化:产品和服务需要进行本地化,满足不同市场的需求。

政策法规

  • 法律合规:不同国家的法律法规复杂,需要仔细研究与遵守。
  • 数据保护:在数据隐私和安全方面,需遵守各国的规定,确保用户数据安全。

竞争激烈

  • 市场竞争:国际市场竞争者众多,需要创新和差异化策略。
  • 品牌认知度:建立和提升品牌在国际市场的认知度和影响力。

成功案例

字节跳动

  • 产品本地化:通过对产品进行本地化调整,适应不同市场的需求。
  • 全球化战略:采用全球化运营模式,实现快速扩展。

华为

  • 技术优势:依靠技术创新和研发优势,在全球市场取得显著份额。
  • 品牌建设:通过品牌推广和市场营销,增强品牌认知度和忠诚度。

超越张一鸣的策略

深耕本地市场

  • 本地团队:建立本地团队,深入了解用户需求,提供定制化服务。
  • 用户体验:提升用户体验,建立用户信任和忠诚度。

技术创新

  • 研发投入:持续投资于研发,以技术领先驱动市场竞争力。
  • 前沿技术:关注并引领前沿技术的发展,保持技术优势。

品牌建设

  • 品牌推广:通过多渠道的品牌推广活动,提升品牌知名度。
  • 市场营销:制定和实施有效的市场营销策略,吸引和留住用户。

结论

中国科技公司在全球扩展过程中面临诸多挑战,但同时也拥有巨大的机遇。通过深耕本地市场、持续技术创新和有效的品牌建设,有望在国际市场上取得更大的成功,超越当前的行业领袖。

阅读更多

近六成的人一年没跳槽、月薪集中在8k-17k、AI可减少20%-40%工作量,2024中国开发者调查报告来了

作者:36氪编辑

根据36氪发布的《2024中国开发者调查报告》显示:

  • 跳槽情况:近60%的开发者在过去一年内没有更换工作。
  • 薪资分布:大部分开发者的月薪集中在8k-17k区间。
  • AI对工作影响:约80%的开发者认为AI能够减少20%-40%的工作量。

报告亮点

行业分布

  • 互联网和科技公司占比最高。
  • 金融、教育等传统行业的开发者比例也在增加。

技能需求

  • 热门编程语言:JavaScript、Python、Java。
  • 新兴技术:云计算、AI、大数据。

工作满意度

  • 大多数开发者对当前的工作满意,主要关注点在于薪资、成长空间和工作环境。

职业发展

  • 超过半数的开发者希望在未来一年内提升技术技能。
  • 很多人计划通过参加培训课程、在线学习和实践项目来提升自己。

详细内容

开发者画像

性别与年龄

  • 开发者中男性占比85%,女性占比15%。
  • 年龄主要集中在25-34岁之间。

学历

  • 本科及以上学历的开发者占比超过70%。

工作状况

工作年限

  • 超过40%的开发者工作年限在5-10年之间。
  • 10年以上工作经验的开发者占比约为20%。

工作时间

  • 大多数开发者每周工作时间在40-50小时之间。

技术栈

编程语言

  • 使用最广泛的编程语言依次为JavaScript、Python、Java、C++、Go。

框架和工具

  • 流行的开发框架包括React、Vue、Spring、Django。
  • DevOps工具如Docker、Kubernetes使用率也在上升。

薪资与福利

薪资水平

  • 月薪在8k-17k的开发者占比最高。
  • 高薪开发者(25k以上)主要集中在一线城市。

福利

  • 常见的福利包括健康保险、带薪休假、弹性工作时间等。

对AI的看法

  • 约80%的开发者认为AI可以显著提高工作效率,减少重复劳动。
  • 但也有部分开发者担心AI可能带来的工作岗位减少问题。

结论

这份报告展示了中国开发者的工作状态和职业发展趋势。AI技术的快速发展,对开发者的工作方式和效率带来了显著影响。开发者们在追求更高薪资和更好的职业发展的同时,也越来越重视个人成长和技能提升。

阅读更多

使用 Electron 和 React 创建桌面应用程序

原文链接

Electron 是一个流行的框架,它允许开发人员使用 HTML、CSS 和 JavaScript 等 Web 技术构建跨平台桌面应用程序。通过将 Electron 与用于构建用户界面的强大 JavaScript 库 React 相结合,我们可以创建功能丰富的桌面应用程序,这些应用程序的感觉和行为就像 Windows、macOS 和 Linux 上的本机应用程序一样。

在本教程中,我们将引导您完成使用 Electron 和 React 创建简单桌面应用程序的过程。我们将介绍如何设置开发环境、创建基本的 React 应用程序、将其与 Electron 集成以及为不同平台构建可分发包。

先决条件

在开始之前,请确保您的系统上安装了以下软件:

  1. Node.js 和 npm(Node 包管理器):访问官方网站(https://nodejs.org/)并按照适合您操作系统的安装说明安装 Node.js 和 npm。

步骤 1:设置新的 React 应用程序

让我们首先使用 设置一个新的 React 应用程序create-react-app

  1. 打开终端或命令提示符并运行以下命令来创建一个新的 React 应用程序:
npx create-react-app electron-react-app

2. 安装完成后,导航到新创建的项目目录:

cd electron-react-app

3. 要验证一切设置是否正确,请运行开发服务器:

npm 启动

现在,你应该可以看到 React 应用程序在你的浏览器中运行http://localhost:3000

第 2 步:安装 Electron

接下来,我们将安装 Electron 并配置我们的 React 应用程序以使用它。

  1. Ctrl+C通过按下终端来停止开发服务器。
  2. 使用 npm安装 Electron 并electron-builder作为开发依赖项:
npm install electron electron-is-dev electron-builder -D

该命令还安装了一个名为的有用 npm 包,electron-is-dev用于检查我们的 electron 应用程序是在开发中还是在生产中。您使用该-D标志在 dev 依赖项下安装 electron。

步骤3:配置Electron

现在,我们将配置 Electron 来运行我们的 React 应用程序。

  1. 在项目的根目录中,创建一个名为 的新文件electron.js。该文件将作为我们的 Electron 应用程序的主要入口点。
  2. 在您喜欢的代码编辑器中打开electron.js并添加以下代码:
// electron.js 
const { app, BrowserWindow } = require(“electron”);
const path = require(“path”);

let mainWindow;

function createWindow(){
mainWindow = new BrowserWindow({
width:800,
height:600,
webPreferences:{
nodeIntegration:true,
},
});

(async () => {
const isDev = (await import('electron-is-dev')).default;

const startURL = isDev
? 'http://localhost:3000'
: `file://${path.join(__dirname, '../build/index.html')}`;

mainWindow.loadURL(startURL);
})();

mainWindow.loadURL (startURL);mainWindow.on

(“ closed”,()=>(mainWindow = null));}
app.on

(“ ready ”,createWindow);

app. on ( 'window-all-closed' , () => {
if (process.platform ! == ' darwin' ) {
app.quit (); } }); app.on ( 'activate' , () => { if (mainWindow === null ) { createWindow (); } });

此代码设置了主 Electron 应用程序窗口,并在开发模式下从开发服务器加载 React 应用程序,或在生产模式下从构建目录加载 React 应用程序。

步骤 4:更新package.json

为了让 Electron 知道我们的主要入口文件和构建目录,我们需要修改该package.json文件。

  1. 打开package.jsonJSON 对象并在其内添加以下行:
// package.json 
{
// ...
"main" : "electron.js" ,

"build" : {
"appId" : "com.example.myapp" ,
"productName" : "我的 Electron 应用" ,
"directories" : {
"output" : "dist"
}
} ,
"scripts": {
// ...
"electron": "electron .",
"dist": "electron-builder"
},

// ...
}

字段"main"指定了 Electron 的入口点,"build"部分提供了的配置选项electron-builder,包括appIdproductName和分发的输出目录。

步骤 5:运行 Electron

现在,让我们测试我们的 Electron 应用程序。

  1. 通过运行以下命令启动 React 应用程序的开发服务器:
npm start

2. 在单独的终端或命令提示符中,运行 Electron 应用程序:

npm run electron

现在您应该看到您的 React 应用程序在独立的 Electron 窗口中运行。

步骤 6:构建可分发包

要打包并分发你的 Electron 应用程序给用户,你需要创建特定于平台的可分发包。electron-builder使这个过程更容易。

  1. 在构建包之前,请停止正在运行的 Electron 应用程序和 React 开发服务器。
  2. 要为您当前的平台构建包,请运行以下命令:
npm run build

该命令将在dist目录中生成一个可分发的包。

要为多个平台构建包,可以使用以下命令:

npm run dist

上述命令将在dist目录中创建适用于 Windows、macOS 和 Linux 的包。

恭喜!您已成功使用 Electron 和 React 创建了桌面应用程序。现在您可以将应用程序分发给不同平台上的用户。

结论

Electron 和 React 为构建跨平台桌面应用程序提供了强大的组合。通过本教程,您已经学会了如何设置 React 应用程序、将其与 Electron 集成以及将其打包以供分发。

请记住,本教程仅涵盖基础知识,您可以使用 Electron 和 React 做更多事情来构建复杂的桌面应用程序。浏览 Electron 和 React 文档以发现更多高级功能和适合您项目的可能性。祝您编码愉快!

项目链接

牛客网 – 字符串排序

https://www.nowcoder.com/share/jump/55776421719927926899

描述

给定 n 个字符串,请对 n 个字符串按照字典序排列。

数据范围: 1≤𝑛≤1000  ,字符串长度满足 1≤𝑙𝑒𝑛≤100 

输入描述:

输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。

输出描述:

数据输出n行,输出结果为按照字典序排列的字符串。

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

let num = 0;
const strArr = [];

void (async function () {
    // Write your code here
    while ((line = await readline())) {
        if (num === 0) {
            num = parseInt(line.trim(), 10);
        } else {
            strArr.push(line.trim());

            const strArrLen = strArr.length;
            if (strArrLen === num) {
                strArr.sort((a, b) => {
                    return a > b ? 1 : -1;
                });

                strArr.forEach((item, index) => {
                    console.log(item);
                });
            }
        }
    }
})();

牛客网 – 质数因子

https://www.nowcoder.com/share/jump/55776421719918468907

描述

功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )

数据范围:1≤n≤2×109+14 

输入描述:

输入一个整数

输出描述:

按照从小到大的顺序输出它的所有质数的因子,以空格隔开。

示例1

输入:

180

复制

输出:

2 2 3 3 5
const rl = require("readline").createInterface({
    input: process.stdin
});
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    while (line = await readline()) {
        let num = parseInt(line.trim());
        let factors = getPrimeFactors(num);
        console.log(factors.join(' '));
    }
}()

function getPrimeFactors(n) {
    let factors = [];
    
    // 处理2的因子
    while (n % 2 === 0) {
        factors.push(2);
        n = Math.floor(n / 2);
    }
    
    // 从3开始处理其他质因子
    let factor = 3;
    while (factor * factor <= n) {
        while (n % factor === 0) {
            factors.push(factor);
            n = Math.floor(n / factor);
        }
        factor += 2;
    }
    
    // 如果 n 本身是一个大于2的质数
    if (n > 2) {
        factors.push(n);
    }
    
    return factors;
}

米老鼠

米老鼠是华特·迪士尼公司创造的一个经典动画角色,也是迪士尼形象中最具代表性的角色之一。他是一只白色的老鼠,通常穿着红色的短裤、大黄鞋和白手套,头戴一顶红色的帽子。米老鼠以其乐观、勇敢和善良的性格而闻名,成为了许多人童年的偶像之一。

米老鼠的首次亮相是在1928年的动画短片《米老鼠船长》中,由华特·迪士尼亲自创作。这部短片不仅是迪士尼公司的第一部有声动画,也标志着米老鼠形象的诞生。随后,米老鼠成为了迪士尼动画的代表性角色,出现在了数以百计的动画短片、电影、电视节目和商品中。

米老鼠的形象代表了乐观、坚韧和友善的品质,他与好朋友唐老鸭、高飞等一起,经历了无数冒险和故事。他也是迪士尼乐园中的重要角色,成为了各大迪士尼乐园的象征之一。

无论是在动画界还是在流行文化中,米老鼠都是一个不朽的经典,代表着迪士尼公司的核心价值观和娱乐精神。

鹦鹉

有一个有趣的故事是关于罗马帝国皇帝克劳狄乌斯(Claudius)和他的一只鹦鹉。据说,克劳狄乌斯非常喜爱鹦鹉,甚至训练它说一些拉丁语。

这只鹦鹉对于宫廷来说是一个非常新奇的玩意儿,因为大多数罗马人当时并不熟悉鹦鹉。克劳狄乌斯的鹦鹉被教会了一些经典的拉丁语片段,有时甚至会在宴会上模仿一些皇帝的声音,引得宾客们捧腹大笑。