全栈开发小项目

news2024/10/18 12:00:31

用到的技术栈:
nodejs+webpack+knockout+mongodb+PM2+rabbitmq

以下是一个综合指南,展示如何将 Node.js、Webpack、Knockout.js、MongoDB、PM2 和 RabbitMQ 集成到一个项目中。

我们将在这一项目中添加 RabbitMQ,用于处理消息队列。这对于任务分派、异步处理等场景非常有用。

第一步: 初始化项目
首先,创建一个新的项目目录并初始化一个 Node.js 项目:

Copy

mkdir my-app
cd my-app
npm init -y
这将在 my-app 目录下创建一个 package.json 文件。

第二步: 安装依赖
我们需要安装以下依赖库:

项目依赖
express: 用于创建服务器
mongoose: 用于连接和操作 MongoDB
knockout: 用于创建响应式 UI
amqplib: AMQP 0-9-1 客户端,用于与 RabbitMQ 交互

Copy

npm install express mongoose knockout amqplib
开发依赖
webpack: 用于打包前端代码
webpack-cli: 命令行工具,用于运行 Webpack
webpack-dev-server: 开发服务器,提供实时重新加载功能

Copy

npm install --save-dev webpack webpack-cli webpack-dev-server
安装 PM2
PM2 是一个进程管理器,用于长时间运行的 Node.js 应用程序:

Copy

npm install pm2 -g
如果希望本地安装 PM2,也可以用以下命令:

Copy

npm install pm2 --save-dev
第三步: 创建服务器文件
创建 server.js
在根目录下创建一个 server.js 文件,并添加以下代码:

Copy

const express = require(‘express’);
const mongoose = require(‘mongoose’);
const amqp = require(‘amqplib/callback_api’);

// 连接到本地 MongoDB 数据库 myapp
mongoose.connect(‘mongodb://localhost:27017/myapp’, {
useNewUrlParser: true,
useUnifiedTopology: true
});

const app = express();
app.use(express.json());

// 定义一个 Mongoose 模型
const ItemSchema = new mongoose.Schema({
name: String
});
const Item = mongoose.model(‘Item’, ItemSchema);

// API 路由
app.get(‘/items’, async (req, res) => {
const items = await Item.find();
res.json(items);
});

app.post(‘/items’, async (req, res) => {
const newItem = new Item(req.body);
await newItem.save();

// 发送消息到 RabbitMQ
sendToQueue(newItem);

res.json(newItem);

});

// 启动服务器
app.listen(3000, () => {
console.log(‘Server is listening on port 3000’);
});

// 连接到 RabbitMQ 并发送消息
function sendToQueue(item) {
amqp.connect(‘amqp://localhost’, (error0, connection) => {
if (error0) {
throw error0;
}

    connection.createChannel((error1, channel) => {
        if (error1) {
            throw error1;
        }
    
        const queue = 'itemQueue';
        const msg = JSON.stringify(item);

        channel.assertQueue(queue, {
            durable: false
        });

        channel.sendToQueue(queue, Buffer.from(msg));
        console.log(" [x] Sent %s", msg);
    });

    setTimeout(() => {
        connection.close();
    }, 500);
});

}
注意: 请确保你的 RabbitMQ 和 MongoDB 服务器正在运行。你可以使用以下命令启动它们:

Copy

启动 MongoDB

mongod

启动 RabbitMQ (RabbitMQ 必须已经安装)

rabbitmq-server
消费 RabbitMQ 队列中的消息
创建一个 consumer.js 文件,用于消费队列中的消息:

Copy

const amqp = require(‘amqplib/callback_api’);

amqp.connect(‘amqp://localhost’, (error0, connection) => {
if (error0) {
throw error0;
}
connection.createChannel((error1, channel) => {
if (error1) {
throw error1;
}

    const queue = 'itemQueue';

    channel.assertQueue(queue, {
        durable: false
    });

    console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", queue);

    channel.consume(queue, (msg) => {
        const item = JSON.parse(msg.content.toString());
        console.log(" [x] Received %s", item.name);
        // 在这里处理收到的消息
    }, {
        noAck: true
    });
});

});
启动 PM2 管理器
PM2 可以用于同时启动我们的 server.js 和 consumer.js 。

更新 package.json 脚本:

Copy

“scripts”: {
“start”: “webpack serve”,
“serve”: “webpack build && pm2 start ecosystem.config.js”
}
创建 ecosystem.config.js:

Copy

module.exports = {
apps: [{
name: ‘server’,
script: ‘server.js’,
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: ‘1G’
}, {
name: ‘consumer’,
script: ‘consumer.js’,
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: ‘1G’
}]
};
配置 Webpack
在根目录下创建一个 webpack.config.js 文件,并添加以下代码:

Copy

const path = require(‘path’);

module.exports = {
entry: ‘./src/main.js’,
output: {
filename: ‘bundle.js’,
path: path.resolve(__dirname, ‘dist’)
},
devServer: {
static: {
directory: path.join(__dirname, ‘dist’),
},
compress: true,
port: 9000
},
mode: ‘development’
};
创建前端代码
创建必要的目录和文件:

Copy

mkdir src
touch src/main.js
touch src/index.html
编辑 src/index.html

Copy

Webpack, Knockout.js, MongoDB, RabbitMQ

Webpack + Knockout.js + MongoDB + RabbitMQ

Add Item
编辑 src/main.js

Copy

import ko from ‘knockout’;

class ViewModel {
constructor() {
this.newItem = ko.observable(‘’);
this.items = ko.observableArray([]);

    this.loadItems();

    this.addItem = this.addItem.bind(this);
}

async loadItems() {
    const response = await fetch('http://localhost:3000/items');
    const items = await response.json();
    this.items(items);
}

async addItem() {
    const response = await fetch('http://localhost:3000/items', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ name: this.newItem() })
    });

    const item = await response.json();
    this.items.push(item);
    this.newItem('');
}

}

ko.applyBindings(new ViewModel());
启动应用
用 Webpack Dev Server 开发
运行以下命令来启动开发服务器:

Copy

npm start
在生产环境中用 PM2 启动
运行以下命令来构建并使用 PM2 启动服务器:

Copy

npm run serve
PM2 管理
一些常用的 PM2 命令包括:

查看所有进程:pm2 list
停止某个进程:pm2 stop <process_id>
重启某个进程:pm2 restart <process_id>
删除某个进程:pm2 delete <process_id>
查看进程日志:pm2 logs <process_id>
通过这些步骤,您已经设置了一个使用 Node.js、Webpack、Knockout.js、MongoDB、PM2 和 RabbitMQ 的综合全栈应用。这种结构对于处理复杂任务和异步操作非常有效。

17:38

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bayes-CNN-LSTM|基于贝叶斯优化的卷积-长短期神经网络多输入数据回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、方法原理介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编…

spark:数据的关联与合并、缓存和checkpoint

文章目录 1. 数据的关联与合并1.1 join关联1.1.1 内关联1.1.2 左关联1.1.3 右关联 1.2 Union合并 2. 缓存和checkpoint 1. 数据的关联与合并 1.1 join关联 students表数据&#xff1a; 1.1.1 内关联 内关联只返回两个 DataFrame 中在连接键上匹配的行。 # join 关联 from…

Microsoft Visual Studio当程序中用了try catch ,如何定位到出错的地方。

在Microsoft Visual Studio中&#xff0c;当用了try catch的时候&#xff0c;程序报错一般会抛出异常到前端&#xff0c;无法捕捉到源代码的地方。这时候只要设置调试就行。

java基本语法(二)

continue&#xff0c;break&#xff0c;return有什么区别 在循环结构中&#xff0c;当循环条件不满足或者循环次数达到要求时&#xff0c;循环会正常结束。但是&#xff0c;有时候可能需要在循环的过程中&#xff0c;当发生了某种条件之后 &#xff0c;提前终止循环&#xff0…

安科瑞/ACREL能源管理软件能耗管理软件

综合智慧能源管理系统的参与方很多&#xff0c;包括电网、能源服务商、大中小微用能企业甚至个人等&#xff0c;这是一个需要多方参与的系统&#xff0c;系统要有很好的兼容性和易用性。首先,系统的设计需要支持多种工业接口的应用,如第三方系统接口、智能感知设备接口以及用能…

【从零开始的LeetCode-算法】3195. 包含所有 1 的最小矩形面积 I

给你一个二维 二进制 数组 grid。请你找出一个边在水平方向和竖直方向上、面积 最小 的矩形&#xff0c;并且满足 grid 中所有的 1 都在矩形的内部。 返回这个矩形可能的 最小 面积。 示例 1&#xff1a; 输入&#xff1a; grid [[0,1,0],[1,0,1]] 输出&#xff1a; 6 解释&…

Xshell使用密钥远程登录Ubuntu 22.04报错:所选的用户密钥未在远程主机上注册。请再试一次

报错截图如下&#xff1a; 问题原因&#xff1a; Ubuntu 22.04 不支持 Xshell使用的私钥。 查看系统支持的私钥&#xff1a;sudo sshd -T | egrep "pubkey" ~$ sudo sshd -T | egrep "pubkey" pubkeyauthentication yes pubkeyacceptedalgorithms ssh-ed…

一字线激光模组在道路检测方面的应用

在现代道路检测领域&#xff0c;一字线激光模组作为一项先进的检测技术&#xff0c;正发挥着越来越重要的作用。这一技术以其独特的优势&#xff0c;为道路检测提供了更为精准、高效的解决方案。接下来我们就一起了解一下关于一字线激光模组在道路检测方面的应用。 一字线激光模…

号码品牌认证是什么?为什么我的号码总被错误标记?

电话营销&#xff0c;听起来十分简单&#xff0c;但想要让客户接听并听完您的介绍&#xff0c;可没那么容易。今天&#xff0c;我就来分享几个让客户“不拒绝”的小技巧。 首先&#xff0c;您可以选择使用号码品牌认证服务&#xff0c;在您拨打电话时&#xff0c;它就像给您的电…

Zico 2 靶机 - 详细流程

✨ 准备工作 靶机 && kali 环境要求 机器名网络配置靶机Zico 2NAT 模式攻击机kaliNAT 模式 靶机下载链接&#xff1a;zico2: 1 ~ VulnHub 打开 VMware&#xff0c;将 zico2.ova 拖拽到 VMware 中 设置 虚拟机名称(A) - 存储路径(P)- 导入 若是&#xff0c;…

FreeRTOS - 单片机程序设计模式

在学习FreeRTOS过程中&#xff0c;结合韦东山-FreeRTOS手册和视频、野火-FreeRTOS内核实现与应用开发、及网上查找的其他资源&#xff0c;整理了该篇文章。如有内容理解不正确之处&#xff0c;欢迎大家指出&#xff0c;共同进步。 单片机程序设计模式&#xff08;第2章&#xf…

10月17日

输入一个数组&#xff0c;循环输出数组的元素&#xff0c;以及各个元素的长度 arr("apple" "banana" "date")# 初始化索引 index0# 获取数组长度 arr_len${#arr[]}# 使用 while 循环遍历数组 while [ $index -lt $arr_len ]; doelement${arr[$in…

“人工智能+中职”:VR虚拟仿真实训室的发展前景

随着人工智能技术的飞速发展&#xff0c;中职教育也迎来了新的发展机遇。特别是虚拟现实&#xff08;VR&#xff09;技术在中职教育领域的应用&#xff0c;结合人工智能的加持&#xff0c;为中职教育提供了全新的教学模式和实训体验。其中&#xff0c;VR虚拟仿真实训室的发展前…

不使用U盘重装windows系统

优点&#xff1a;可以不使用U盘&#xff0c;重装速度快&#xff0c;可以保留系统的激活状态&#xff01; 然后自己设置就可以重装系统了~~~

【重学 MySQL】七十、揭秘数据库对象,打造高效数据管理之旅

【重学 MySQL】七十、揭秘数据库对象&#xff0c;打造高效数据管理之旅 数据库&#xff08;Database&#xff09;数据表&#xff08;Table&#xff09;视图&#xff08;View&#xff09;存储过程&#xff08;Stored Procedure&#xff09;触发器&#xff08;Trigger&#xff09…

初识git · 有关模型

目录 前言&#xff1a; 有关开发模型 前言&#xff1a; 其实文章更新到这里的时候&#xff0c;我们已经学习了可以满足我们日常生活中的基本需求的指令了&#xff0c;但是为什么要更新本篇文章呢&#xff1f;是因为实际生活中我们对于开发工作&#xff0c;运维工作&#xff…

每日OJ题_牛客_非对称之美_最长非回文字符串_C++_Java

目录 牛客_非对称之美_最长非回文字符串 题目解析 C代码 Java代码 牛客_非对称之美_最长非回文字符串 非对称之美 (nowcoder.com) 题目解析 找到规律就是最长非回文字符串&#xff08;判断是否全同->0&#xff0c;否则是n-1&#xff08;回文减去1&#xff09;或n&…

架构设计笔记-17-通信系统架构设计理论及实践

目录 知识要点 案例分析 1.数据中心架构的技术 论文 1.论网络安全体系设计 知识要点 开放系统的存储方式主要有&#xff1a; 1. 直连式存储&#xff08;Direct-Attached Storage&#xff0c;DAS&#xff09;&#xff1a;在服务器上外挂一组大容量硬盘&#xff0c;存储设…

Maven--简略

简介 Apache旗下的一款开源项目&#xff0c;用来进行项目构建&#xff0c;帮助开发者管理项目中的jar及jar包之间的依赖&#xff0c;还拥有项目编译、测试、打包的功能。 管理方式 统一建立一个jar仓库&#xff0c;把jar上传至统一的仓库&#xff0c;使用时&#xff0c;配置…

生产工单系统的功能是什么?有哪些应用实践?

前段时间我们公司忙得不可开交&#xff1a;订单像雪花一样飞来&#xff0c;可生产现场却一片混乱。客户催单的电话不断&#xff0c;大家都急得像热锅上的蚂蚁。我也整天为了协调各个环节而焦头烂额。有一天路过生产车间&#xff0c;看到大家手忙脚乱地找单子、问进度&#xff0…