Quickstarters
Feature Overview
如何为NodeJS构建后端?
48 分
介绍 在本教程中,您将学习如何使用 back4app 为 nodejs 应用程序构建完整的后端。 我们将逐步整合 back4app 的基本功能 如数据库管理、云代码函数、rest 和 graphql api、用户身份验证以及实时查询(实时查询) 以创建一个安全、可扩展且强大的后端,与您的 nodejs 代码无缝通信。 您还将看到 back4app 的快速设置和直观环境如何大幅减少与手动配置服务器和数据库相比所需的时间和精力。 在此过程中,您将获得关键功能的实践经验,包括高级安全功能、使用云作业调度任务以及为外部集成设置 webhook。 在本教程结束时,您将为将此基础设置提升为生产就绪的应用程序做好充分准备,或根据需要轻松地整合自定义逻辑和第三方 api。 前提条件 要完成本教程,您需要 一个 back4app 账户和一个新的 back4app 项目 开始使用 back4app https //www back4app com/docs/get started/new parse app 如果您没有账户,可以免费创建一个。请按照上面的指南准备好您的项目。 安装 node js(版本 14 或更高) 您需要 node js 来安装 npm 包和运行您的后端服务器。 安装 node js https //nodejs org/en/download/ 一个基本的 nodejs 设置 您可以通过运行 npm init (或 yarn init ) 来初始化一个 node 项目。确保您有一个 package json 文件来管理您的依赖项。 熟悉 javascript 和基本的 nodejs 概念 nodejs 官方文档 https //nodejs org/en/docs/ 如果您是 node 的新手,请在开始之前查看官方文档或初学者教程。 在开始之前,请确保您具备所有这些前提条件。设置好您的 back4app 项目和本地 nodejs 环境将帮助您更轻松地跟随。 步骤 1 – 设置 back4app 项目 创建一个新项目 在 back4app 上构建 nodejs 后端的第一步是创建一个新项目。如果您还没有创建,请按照以下步骤操作: 登录到您的 back4app 账户 。 点击您的 back4app 仪表板中的 “新应用” 按钮 。 给您的应用命名 (例如,“nodejs 后端 教程”)。 项目创建后,您将在 back4app 仪表板中看到它列出。该项目将是本教程中讨论的所有后端配置的基础。 连接 parse sdk back4app 依赖 parse 平台来管理您的数据,提供实时功能,处理用户身份验证等。将您的 nodejs 应用连接到 back4app 涉及安装 parse npm 包并使用您 back4app 仪表板中的凭据进行初始化。 检索您的 parse 密钥 在您的 back4app 仪表板中,导航到您应用的 “应用设置” 或 “安全与密钥” 部分以找到您的 应用程序 id 和 javascript 密钥 您还会找到 parse 服务器 url (通常格式为 https //parseapi back4app com )。 在您的 nodejs 项目中安装 parse sdk : npm install parse 如果您使用 yarn,可以使用以下命令安装它: yarn add parse 在您的 nodejs 应用程序中初始化 parse 在您的 node 项目的根目录下创建一个文件(例如, parseconfig js ): src/parseconfig js const parse = require('parse/node'); // replace the placeholders with your back4app credentials parse initialize('your application id', 'your javascript key'); parse serverurl = 'https //parseapi back4app com'; module exports = parse; 然后,在您的主入口文件中(例如, index js ),导入 parse 以建立连接: const parse = require(' /src/parseconfig'); // your nodejs logic here, now fully connected to back4app 通过完成此步骤,您已在 nodejs 后端和 back4app 基础设施之间建立了安全连接。所有请求和数据交易都通过此 sdk 安全路由,从而减少了手动 rest 或 graphql 调用的复杂性(尽管在需要时您仍然可以使用它们)。 步骤 2 – 设置数据库 保存和查询数据 在您的 back4app 项目设置完成并将 parse sdk 集成到您的 node 应用程序后,您现在可以开始保存和检索数据。创建记录的最简单方法是使用 parse object 类: // example create a todo item const parse = require(' /src/parseconfig'); async function createtodoitem(title, iscompleted) { const todo = parse object extend('todo'); const todo = new todo(); todo set('title', title); todo set('iscompleted', iscompleted); try { const savedtodo = await todo save(); console log('todo saved successfully ', savedtodo); return savedtodo; } catch (error) { console error('error saving todo ', error); } } // example query all todo items async function fetchtodos() { const todo = parse object extend('todo'); const query = new parse query(todo); try { const results = await query find(); console log('fetched todo items ', results); return results; } catch (error) { console error('error fetching todos ', error); } } 或者,您可以使用 back4app 的 rest api 端点: curl x post \\ h "x parse application id your application id" \\ h "x parse rest api key your rest api key" \\ h "content type application/json" \\ d '{"title" "buy groceries", "iscompleted" false}' \\ https //parseapi back4app com/classes/todo back4app 还提供 graphql 接口: mutation { createtodo(input { fields { title "clean the house" iscompleted false } }) { todo { objectid title iscompleted } } } 这些多样的选项让您可以以最适合您开发过程的方式集成数据操作 无论是通过 parse sdk、rest 还是 graphql。 架构设计和数据类型 默认情况下,parse 允许 动态创建架构 , 但您也可以在 back4app 仪表板中定义您的类和数据类型,以获得更多控制。 在您的 back4app 仪表板中导航到 “数据库” 部分 创建一个新类 (例如,“todo”)并添加相关列,例如标题(字符串)和是否完成(布尔值)。 back4app 还支持多种数据类型: 字符串 , 数字 , 布尔值 , 对象 , 日期 , 文件 , 指针 , 数组 , 关系 , 地理点 , 和 多边形 您可以为每个字段选择适当的类型。如果您愿意,您也可以让 parse 在您第一次从 node 应用程序保存对象时自动创建这些列。 back4app 提供一个 ai 代理,可以帮助您设计数据模型: 打开 ai 代理 从您的应用仪表板或菜单中。 用简单的语言描述您的数据模型 (例如,“请在 back4app 上创建一个新的待办事项应用,带有完整的类架构。”)。 让 ai 代理为您创建架构 使用 ai 代理可以在设置数据架构时节省时间,并确保您的应用程序的一致性。 关系数据 如果您有关系数据——例如,一个 类别 对象指向多个 待办事项 项目——您可以在 parse 中使用 指针 或 关系 。例如,向一个 类别 添加指针: // linking a task to a category with a pointer async function createtaskforcategory(categoryobjectid, title) { const todo = new parse object('todo'); // construct a pointer to the category const categorypointer = new parse object('category'); categorypointer id = categoryobjectid; // set fields todo set('title', title); todo set('category', categorypointer); try { return await todo save(); } catch (err) { console error('error creating task with category relationship ', err); } } 当您查询时,您还可以包含指针数据: const query = new parse query('todo'); query include('category'); const todoswithcategory = await query find(); 这个 include('category') 调用会在每个待办事项旁边获取类别详细信息,使您的关系数据无缝可访问。 实时查询 要获取实时更新,back4app 提供 实时查询 在您的 nodejs 应用中,您可以订阅特定类的更改 在您的 back4app 控制面板中启用 实时查询 ,在您的应用的 服务器设置 确保“实时查询”已开启。 在您的代码中初始化实时查询订阅 : src/parseconfig js const parse = require('parse/node'); // replace the placeholders with your back4app credentials parse initialize('your application id', 'your javascript key'); parse serverurl = 'https //parseapi back4app com'; // live query's subdomain parse livequeryserverurl = 'wss\ //your subdomain here b4a io'; module exports = parse;const parse = require(' /parseconfig'); async function subscribetotodos(callback) { const query = new parse query('todo'); const subscription = await query subscribe(); subscription on('create', (newtodo) => { console log('new todo created ', newtodo); callback('create', newtodo); }); subscription on('update', (updatedtodo) => { console log('todo updated ', updatedtodo); callback('update', updatedtodo); }); subscription on('delete', (deletedtodo) => { console log('todo deleted ', deletedtodo); callback('delete', deletedtodo); }); return subscription; } 通过订阅,您可以在每次创建、更新或删除新的 todo 时接收实时通知。此功能对于需要多个用户查看最新数据而无需手动轮询服务器的协作或动态应用特别有价值。 步骤 3 – 使用 acl 和 clp 应用安全性 back4app 安全机制 back4app 通过提供 访问控制列表 (acls) 和 类级权限 (clps) , 认真对待安全性。这些功能允许您限制谁可以在每个对象或每个类的基础上读取或写入数据,确保只有授权用户可以修改您的数据。 访问控制列表 (acls) 一个 acl 应用于单个对象,以确定哪些用户、角色或公众可以执行读/写操作。例如: async function createprivatetodo(title, owneruser) { const todo = parse object extend('todo'); const todo = new todo(); todo set('title', title); // create an acl granting read/write access only to the owner const acl = new parse acl(owneruser); acl setpublicreadaccess(false); acl setpublicwriteaccess(false); todo setacl(acl); try { return await todo save(); } catch (err) { console error('error saving private todo ', err); } } 当你保存对象时,它有一个acl,防止除了指定用户之外的任何人读取或修改它。 类级权限(clps) clps 管理整个类的默认权限,例如该类是否可以公开读取或写入,或者是否只有某些角色可以访问它。 转到你的back4app仪表板 , 选择你的应用程序,然后打开 数据库 部分。 选择一个类 (例如,“todo”)。 打开类级权限 标签。 配置你的默认设置,例如“需要身份验证”以进行读取或写入,或“无访问”给公众。 这些权限设置了基线,而acl则为单个对象微调权限。一个强大的安全模型通常结合了clp(广泛限制)和acl(每个对象的细粒度限制)。有关更多信息,请访问 应用安全指南。 步骤 4 – 编写和部署云函数 云代码是parse server环境的一个特性,允许您在服务器端运行自定义javascript代码 无需管理您的服务器或基础设施。通过编写云代码,您可以通过额外的业务逻辑、验证、触发器和集成来扩展您的back4app后端,这些都在parse server上安全高效地运行。 它是如何工作的 当你编写云代码时,通常会将你的 javascript 函数、触发器和任何所需的 npm 模块放在一个 main js (或其他 js 文件)中,并将其部署到你的 back4app 项目中。然后,这段代码将在 parse server 环境中执行。由于这些函数和触发器在服务器上运行,你可以信任它们处理机密逻辑、处理敏感数据或进行仅限后端的 api 调用——这些过程你可能不想直接暴露给客户端。 你在 back4app 应用的所有云代码都在 back4app 管理的 parse server 内运行,因此你不必担心服务器维护、扩展或配置。每当你更新并部署你的文件时,正在运行的 parse server 会更新为你最新的代码。 main js 文件结构 一个典型的 main js 可能包含: 所需模块的 require 语句(npm 包、内置 node 模块或其他云代码文件)。 云函数定义 使用 parse cloud define() 。 触发器 如 parse cloud beforesave() , parse cloud aftersave() , 等等。 你安装的 npm 模块 (如果需要)。例如,你可能会安装一个像 axios 的包来进行 http 请求。然后你可以在文件顶部 require 它。 // main js // 1 import necessary modules and other cloud code files const axios = require('axios'); // 2 define a custom cloud function parse cloud define('fetchexternaldata', async (request) => { const url = request params url; if (!url) { throw new error('url parameter is required'); } const response = await axios get(url); return response data; }); // 3 example of a beforesave trigger parse cloud beforesave('todo', (request) => { const todo = request object; if (!todo get('title')) { throw new error('todo must have a title'); } }); 通过安装和使用 npm 模块的能力,云代码变得极其灵活,允许你与外部 api 集成、执行数据转换或执行复杂的服务器端逻辑。 典型用例 业务逻辑 例如,您可以通过聚合多个对象属性来计算用户在游戏中的得分,然后自动存储该数据。 数据验证 确保某些字段存在或用户在保存或删除记录之前具有正确的权限。 触发器 当数据发生变化时执行操作(例如,当用户更新其个人资料时发送通知)。 集成 连接第三方api或服务。例如,您可以直接从云代码集成支付网关、slack通知或电子邮件营销平台。 安全执行 通过在您的云代码函数中验证和清理输入参数来增加额外的安全层。 部署您的函数 以下是一个简单的云代码函数,用于计算从客户端发送的文本字符串的长度: main js // main js parse cloud define('calculatetextlength', async (request) => { const { text } = request params; if (!text) { throw new error('no text provided'); } return { length text length }; }); 通过 back4app cli 1 安装 cli 对于 linux/macos curl https //raw\ githubusercontent com/back4app/parse cli/back4app/installer sh | sudo /bin/bash 对于 windows 下载 b4a exe 文件从 发布页面 https //github com/back4app/parse cli/releases 2 配置您的账户密钥 b4a configure accountkey 3 部署您的云代码 b4a deploy 通过仪表板部署 在您应用的仪表板中,转到 云代码 > 函数 将函数复制/粘贴到 main js 编辑器中 点击 部署 调用您的函数 通过您的 nodejs 代码使用 parse sdk const parse = require(' /parseconfig'); async function gettextlength(text) { try { const result = await parse cloud run('calculatetextlength', { text }); console log('text length ', result length); } catch (err) { console error('error calling cloud function ', err); } } 您也可以通过 rest 调用它 curl x post \\ h "x parse application id your app id" \\ h "x parse rest api key your rest api key" \\ h "content type application/json" \\ d '{"text" "hello back4app"}' \\ https //parseapi back4app com/functions/calculatetextlength 或者通过 graphql mutation { calculatetextlength(input { text "hello graphql" }) { result } } 这种灵活性使您能够将自定义逻辑集成到 nodejs 环境或其他支持 rest 或 graphql 的客户端的任何部分。 步骤 5 – 配置用户身份验证 back4app 中的用户身份验证 back4app 利用 parse user 类作为身份验证的基础。默认情况下,parse 处理密码哈希、会话令牌和安全存储。这意味着您不必手动设置复杂的安全流程。 设置用户身份验证 在 nodejs 环境中,您可以使用以下代码创建新用户: const parse = require(' /parseconfig'); async function signupuser(username, password, email) { const user = new parse user(); user set('username', username); user set('password', password); user set('email', email); try { await user signup(); console log('user signed up successfully!'); } catch (error) { console error('error signing up user ', error); } } 登录现有用户: async function loginuser(username, password) { try { const user = await parse user login(username, password); console log('user logged in ', user); } catch (error) { console error('error logging in user ', error); } } 通过 rest,登录可能看起来像: curl x get \\ h "x parse application id your app id" \\ h "x parse rest api key your rest api key" \\ g \\ \ data urlencode 'username=alice' \\ \ data urlencode 'password=secret123' \\ https //parseapi back4app com/login 会话管理 成功登录后,parse 创建一个 会话令牌 ,该令牌存储在用户对象中。在您的 node 代码中,如果您在应用程序逻辑中维护会话,您可以访问当前登录的用户: const currentuser = parse user current(); if (currentuser) { console log('currently logged in user ', currentuser getusername()); } else { console log('no user is logged in'); } parse 自动在后台处理基于令牌的会话,但您也可以手动管理或撤销它们。注销的方法是: await parse user logout(); 社交登录集成 back4app 和 parse 可以与流行的 oauth 提供商集成,例如 google 或 facebook , 通过安装额外的包或使用现有的适配器。例如,您可以通过配置您的 facebook 应用 id 并使用 parse facebookutils login() 详细说明可能有所不同,因此请参考 社交登录文档。 https //www back4app com/docs/platform/sign in with apple const facebooklogin = async () => { try { const user = await parse facebookutils login('email'); console log(user existed() ? 'user logged in' 'user signed up and logged in'); } catch (error) { console error('error logging in with facebook ', error); } }; 电子邮件验证和密码重置 要启用电子邮件验证和密码重置: 在您的 back4app 控制面板中导航到 电子邮件设置 启用电子邮件验证 以确保新用户验证其电子邮件地址的所有权。 配置发件人地址 , 电子邮件模板,以及如果需要的话,您的自定义域名。 这些功能通过验证用户对电子邮件的所有权并提供安全的密码恢复方法来提高账户安全性和用户体验。 步骤 6 – 处理文件存储 上传和检索文件 解析包括 parse file 类用于处理文件上传,back4app 安全地存储这些文件 const parse = require(' /parseconfig'); async function uploadimage(filepath) { // filepath is the path to your file on the server const fs = require('fs'); const filedata = fs readfilesync(filepath); const filename = filepath split('/') pop() || 'upload png'; const parsefile = new parse file(filename, array from(filedata)); try { const savedfile = await parsefile save(); console log('file saved ', savedfile url()); return savedfile url(); } catch (err) { console error('error uploading file ', err); } } 要将文件附加到数据库中的对象,可以这样做 async function createphotoobject(filepath) { const photo = parse object extend('photo'); const photo = new photo(); const fs = require('fs'); const filedata = fs readfilesync(filepath); const filename = filepath split('/') pop() || 'upload png'; const parsefile = new parse file(filename, array from(filedata)); photo set('imagefile', parsefile); return await photo save(); } 检索文件 url 非常简单 const imagefile = photo get('imagefile'); const imageurl = imagefile url(); 文件安全性 parse server 提供灵活的配置来管理文件上传安全性。以下示例展示了如何设置权限以控制谁可以将文件上传到服务器 enableforpublic 设置为 true 时,允许任何人,无论其身份验证状态如何,上传文件。 enableforanonymoususer 控制未注册的匿名用户是否可以上传文件。 enableforauthenticateduser 指定是否仅允许经过身份验证的用户上传文件。这对于确保只有受信任的用户可以访问此功能是理想的。 步骤 7 – 使用云作业调度任务 云作业 云作业 在 back4app 中让您可以安排和运行后台的例行任务 比如清理旧数据或发送每日摘要邮件。一个典型的云作业可能看起来像这样 // main js parse cloud job('cleanupoldtodos', async (request) => { // this runs in the background, not triggered by a direct user request const todo = parse object extend('todo'); const query = new parse query(todo); // for example, remove todos older than 30 days const now = new date(); const thirty days = 30 24 60 60 1000; const cutoff = new date(now thirty days); query lessthan('createdat', cutoff); try { const oldtodos = await query find({ usemasterkey true }); await parse object destroyall(oldtodos, { usemasterkey true }); return `deleted ${oldtodos length} old todos `; } catch (err) { throw new error('error during cleanup ' + err message); } }); 部署您的云代码 使用新作业(通过 cli 或仪表板)。 转到 back4app 仪表板 > 应用设置 > 服务器设置 > 背景作业 安排 作业每天运行或按您需要的任何间隔运行。 云作业使您能够自动化后台维护或其他定期过程 无需手动干预。 步骤 8 – 集成 webhooks webhooks 允许您的 back4app 应用在某些事件发生时向外部服务发送 http 请求。这对于与第三方系统(如支付网关(例如,stripe)、电子邮件营销工具或分析平台)集成非常强大。 导航到 webhooks 配置 在您的 back4app 控制面板 > 更多 > webhooks,然后点击添加 webhook。 设置一个端点 (例如, https //your external service com/webhook endpoint https //your external service com/webhook endpoint )。 配置触发器 以指定您的 back4app 类或云代码函数中哪些事件将触发 webhook。 例如,如果您想在创建新 todo 时通知 slack 频道: 创建一个接受传入webhook的slack应用程序。 复制slack webhook url。 在您的back4app仪表板中,将事件“todo类中的新记录”的端点设置为该slack url。 如果需要,您还可以添加自定义http头或有效负载。 您还可以通过在触发器中进行自定义http请求来定义cloud code中的webhook,例如beforesave、aftersave: 第9步 – 探索back4app管理面板 “ back4app管理应用程序 ”是一个基于web的管理界面,旨在让非技术用户执行crud操作并处理常规数据任务,而无需编写任何代码。它提供了一个 以模型为中心 , 用户友好 的界面,简化了数据库管理、自定义数据管理和企业级操作。 启用管理应用程序 通过转到 应用仪表板 > 更多 > 管理应用程序 并单击“启用管理应用程序”按钮来启用它。 创建第一个管理员用户 (用户名/密码),这将自动在您的应用程序架构中生成一个新角色(b4aadminuser)和类(b4asetting、b4amenuitem和b4acustomfield)。 选择一个子域名 以访问管理界面并完成设置。 登录 使用您创建的管理员凭据访问新的管理员应用程序仪表板。 启用后,back4app 管理应用程序使您可以轻松查看、编辑或删除数据库中的记录 无需直接使用 parse 仪表板或后端代码。通过可配置的访问控制,您可以安全地与需要清晰、点击式管理数据的团队成员或客户共享此界面。 结论 通过遵循本综合教程,您已经: 创建了一个安全的后端 用于 back4app 上的 nodejs 应用程序。 配置了一个数据库 具有类模式、数据类型和关系。 集成了实时查询 (实时查询)以实现即时数据更新。 应用了安全措施 使用 acl 和 clp 来保护和管理数据访问。 实现了云代码 函数在服务器端运行自定义业务逻辑。 设置了用户身份验证 支持电子邮件验证和密码重置。 管理文件上传 和检索,具有可选的文件安全控制。 调度云作业 用于自动化后台任务。 使用 webhooks 与外部服务集成。 探索了 back4app 管理面板 进行数据管理。 凭借坚实的 nodejs 基础和强大的 back4app 后端,您现在已具备开发功能丰富、可扩展和安全的应用程序的能力。继续探索更高级的功能,集成您的业务逻辑,并利用 back4app 的强大功能为您节省无数小时的服务器和数据库管理时间。祝您编码愉快! 下一步 构建一个生产就绪的 nodejs 应用程序 通过扩展这个后端以处理更复杂的数据模型、缓存策略和性能优化。 集成高级功能 例如专门的身份验证流程、基于角色的访问控制或外部 api(如支付网关)。 查看 back4app 的官方文档 以深入了解高级安全性、性能调优和日志分析。 探索其他教程 关于实时聊天应用程序、物联网仪表板或基于位置的服务。您可以将这里学到的技术与第三方 api 结合起来,创建复杂的现实世界应用程序。