【第六章—进阶话题】《node.js开发指南》读书笔记

第六章认识Node.js服务器开发 在上面的例子中,我们首先引入了Node.js的fs模块,然后分别使用同步和异步的方式读取指定文件夹下的所有文件,并将文件名输出到控制台中。可以看到,在同步读取的方式下,程序会一直等待文件读取完成后才会执行下一步操作,而在异步读取的方式下,程序会立即执行下一步操作,而读取文件的回调函数则会在后台执行,文件读取完成后会自动调用。当异步操作完成后,操作的结果被传递给回调函数进行处理,在本案例中,回调函数是在延时结束后被执行。异步 API 的返回值无法直接获取,因为它们的结果是通过回调函数传递的。 阅读详情

6.1 模块的加载机制

 描述node.js模块的内部机制。

 

6.1.1 模块的类型

分为两大类,一类是核心模块,一类是文件模块。

核心模块:如fs,http,net,vm。这些都是官方提供模块。他们具有最高优先级,即使重名也是首先加载。

文件模块:是储存为单独文件的,可能是.js .json 或者c/c++扩展。没有显式指定扩展名会依次尝试格式。

 

6.1.4 加载缓存

node.js不会被重复加载,而且node.js是根据实际文件缓存的。

require('express')
require('./node_modules/express')

即使是这样也不会重复加载。

 

6.1.5 加载顺序

摘自书中段落:

(3) 假设当前目录为 current_dir,按路径加载 current_dir/node_modules/some_module。
· 如果加载成功,结束。
· 如果加载失败,令current_dir为其父目录。
· 重复这一过程,直到遇到根目录,抛出异常,结束。

 

6.2 控制流

基于异步I/O容易将程序的逻辑拆的七零八落,给控制流带来困难,接下来解决这些问题。

 

6.2.1 循环的陷阱

在回调函数内访问到的i,已经超越了数组下标。所以输出undefined。

const fs = require('fs');

let fileNames = ['a.txt', 'b.txt', 'c.txt'];
for (var i = 0; i < fileNames.length; i++) {
    (function (i) {
        fs.readFile(fileNames[i], 'utf-8', (err, data) => {
            console.log(`${fileNames[i]} data:${data}`);
        });
    })(i)
}

 

Node.js 命令行实战:从入门到精通 Node.js是一个功能强大的JavaScript运行环境,可以用于开发各种类型的应用程序。通过学习和掌握Node.js命令行工具和最佳实践,您可以提高开发效率和代码质量,构建更好的Node.js应用程序。 阅读详情

相关推荐

从浏览器到Node.js:探索JavaScript的多样性

本文深入探讨了JavaScript在不同环境下的使用方法,包括在浏览器控制台、Node.js以及文件和shell脚本中的操作。我们学习了如何在交互式环境中打印“hello, world!”,了解了Node.js的基本使用,以及如何将JavaScript代码保存到文件中并执行。此外,我们还探索了JavaScript中的字符串基础,包括字符串字面量的创建和引号的使用。本文旨在帮助读者理解和掌握JavaScript在各种场景下的应用。

weixin_42298254的博客 431

《Node.js开发指南》书评汇总

刚查了下库存,发现订阅《Node.js开发指南》的读者大增,这是为什么呢?看了下近期本书在豆瓣的评论,口碑很好,现将豆瓣的书评汇总如下: ---------------------------------------------------------------------------------------------- 1、不错的Node.js入门书籍  我是在图灵买的

图灵教育 2110

Node.js与Redis构建可扩展应用的指南

本书详尽介绍了使用Node.js和Redis构建可扩展应用程序的过程。从基础的Express框架开始,逐步深入到实时应用开发、用户认证、消息队列、前端依赖管理、前端框架应用、JavaScript编码最佳实践,以及部署和扩展性问题。作者分享了个人在使用Node.js进行后端开发的体验和感悟,强调了其在现代web应用开发中的重要性和便利性。

weixin_33506815的博客 338

第六章 Node.js进阶话题

6.1 独立的话题  模块加载机制;  异步编程模式下的控制流;  Node.js 应用部署;  Node.js的一些劣势。   6.2 模块加载机制 Node.js 的模块加载对用户来说十分简单,只需调用 require 即可,但其内部机制较为复杂。我们通过这一节简要介绍一下 Node.js 模块加载的一些细节,帮你减少开发中可能遇到的问题。 模块的类型 Node.js 的...

boss2967的博客 183

AI量化投资开源平台——Qlib(微矿)的学习使用笔记(随缘更新)

Qlib 涵盖了量化投资的全过程,为用户的 AI 算法提供了高性能的底层基础架构,从框架设计上让用户可以更容易地应用 AI 算法来辅助解决量化投资的各个关键问题(例如 Alpha 预测,风险预测,市场动态性建模)。本文旨在记录一些面向初学者的基础内容。

in_void的博客 3133

MatLab Desired port was :31515解决方案

前言:使用的MatLabR2022b今天突然出现了错误,在程序中打不开文件。后尝试了下面的方法,可以解决。后面还有另一种方法,上面方法如果行不通,大家可以尝试一下。搜索栏输入:firewall.cpl。找到相关项,右键属性,设置为允许。

qq_42212501的博客 1342

.NET 开发者的 Node 学习指南(一)

本书的目的在于帮助.NET 或 Java 开发者过渡到 Node.js。您可能有一些 Web 开发经验,也许您过去写过一些基于浏览器的 JavaScript。可能并不明显为什么有人想要将 JavaScript 从浏览器中移出并用于服务器端开发。然而,这正是 Node.js 所做的事情。更重要的是,Node.js 已经存在了足够长的时间,已经成熟为一个平台,并且其令人印象深刻的增长势头已经远远超过了任何可以归因于新技术初期炒作的时期。

龙哥盟 957

Phantom Omni的力与力矩操作

*本说明为对Phantom Omni的力与力矩操作 ****************虚拟夹具的力读取与控制************************ 1、首先力的读取要声明【全局变量】 hduVector3Dd F;//三维矢量力(x,y,z三个方向的力) 2、对力的控制可以采用配置函数Set()与Get()函数; 3、对力觉的控制或读取操作需要放到【回调帧】开始与结束之间,如例子

xuliang355的博客 2562

~【笔记】黑马node.js(p1~p94node.js部分)笔记~

点击通往->黑马node.js视频. 黑马node.js笔记 & 目录:第一章 Node开发概述一、服务器端开发要做的事情二、为什么选择Node三、Node是什么四、Node运行环境搭建五、Node.js快速入门第二章 模块化开发一、node.js模块化开发二、系统模块三、第三方模块四、node_modules文件夹五、node.js中模块的加载机制第三章、服务器端基础一、创建web服务器二、http协议三、HTTP请求与响应处理四、Node.js的工作原理第四章 数据库基础一、数据库概述

weixin_55935744的博客 2574

最简解决 Unity Error Registry configuration is invalid Unable to connect https packages.unity.cn

前言 在学习其他大佬项目的时候,大佬说项目能直接运行,然后我拉下来就报如下错误 Unity报错:[Package Manager]Error Registry configuration is invalid:Unable to connect “https://packages.unity.cn” 翻了很多博发现是 unity3d 中国增强版的原因,中国增强版屏蔽了国外自定义的插件仓库。 安装 非中国增强版后可以成功打开。 然后大家给出的解决方案都比较激进,大抵就是更换Unity版本就OK了。 当然我是觉

Gipsyz的博客 6842

鸿蒙录屏推流应用完整解决方案

本文介绍了鸿蒙录屏推流应用的完整解决方案。项目采用分层架构设计,包含录屏、编码、推流等功能模块,要求实现4小时稳定运行且延迟小于3秒。技术实现包括:1) 通过config.json配置应用权限和功能;2) 使用ScreenRecorderManager类管理录屏服务,实现视频采集、音频录制和编码参数配置;3) 核心功能包含初始化录屏器、开始/停止录屏等操作。该方案充分利用鸿蒙系统的多媒体API,实现了高性能的屏幕录制与实时推流功能。

huanghm88的专栏 291

写给 Python 开发者的 JavaScript 实用指南(二)

耶,我们终于进入了 DOM 并对其进行了操作!恭喜你迄今为止的成就!现在,我们可以通过 JavaScript 动态地改变页面上的内容,而不仅仅是使用警报和控制台消息。和是我们进入 DOM 的神奇领域的门户。DOM 只存在于内存中,作为 HTML 在页面加载时的动态表示。这些方法的选择器将使用 CSS 选择器;旧方法不会。节点的属性可以更改,但术语不同。在下一章中,我们将更多地使用events。事件是 JavaScript 程序的核心,让我们学习它们的结构和用法。使用。

龙哥盟 1372

数学建模算法案例精讲500篇-【深度强化学习】深度确定性策略梯度(DDPG)(附MATLAB和python代码实现)

它是一种学习连续动作的无模型策略算法。它结合了DPG(确定性策略梯度)和DQN(深度Q网络)的思想。它利用DQN中的经验重放和延迟更新的目标网络,并基于DPG,可以在连续的动作空间上运行。# 用于生成带有噪声的动作def __init__(self, action_space, mu=0.0, theta = 0.15, max_sigma = 0.3, min_sigma = 0.3, decay_period = 100000):#decay_period要根据迭代次数合理设置# 均值 mu。

qq_36130719的博客 325

Node 现代前端开发(一)

本书涵盖了使你充分利用 Node.js 的力量、其概念和其生态系统所需的一切。这包括你需要了解的所有关于模块系统、包、辅助库、CLI 工具、WebAssembly 以及一系列可用的工具,如打包器(Webpack(v5)、Parcel(v2)、Vite 和 esbuild)、测试运行器(AVA、Jest 和 Mocha)、转译器(Babel 和 TypeScript)以及许多其他工具(Flow、Prettier、eslint 和 Stylelint)的内容。本书面向初级和中级前端 Web 开发者,他们希望利用

龙哥盟 1145

AI Agent开发第49课-DIFY让AI自动预约排班后发企业微信通知-MongoDb-Redis-企业微信调用

我们的Dify会讲得很透彻,坚持喂饭级教程,从一个基本的AI自动预约客户到自动记录客户的信息再到自动判断下一步如何走全部是AI化的,这是一个真正的AI原生应用,它来自于我的一个大型物业公司用AI自动预约系统中的一部分。我们会使用这个预约流做完整的Dify例子来讲完,因为它太有代表性了。工作流中的控制反转、AI决策下一步怎么走、人为干涉、用户行为判断、外部中间件如Redis,今天我们就要讲到在Dify中调用MongoDB的数据以及企业微信通知来作为预约派单的最后一步了。

打造全国最全的AI Agent开发知识领域的博客 1755

利用R语言通过holtwinters模型进行预测

使用Holt-Winters模型进行预测的第一步是对模型进行拟合。该函数需要两个参数:您的时间序列数据和一个“seasonal”参数,该参数指示您的数据的周期性(例如,如果您的数据按月记录,则应将“seasonal”参数设置为12,因为一年有12个月)。拟合模型后,您可以使用“forecast()”函数进行预测。该函数需要两个参数:您的拟合模型以及您要进行预测的时间段的长度。要使用Holt-Winters模型,您需要安装并加载“forecast”包。以下是进行Holt-Winters模型预测的示例代码。

Mrrunsen的博客 1696

《node.js权威指南》读书笔记

第一章 node.js介绍 非阻塞型I/O机制 当在访问数据库取得搜索结果的时候,在开始访问数据库之后,数据库返回结果之前,存在一段等待时间。 在传统的单线程处理机制中,在执行了访问数据库的代码之后,整个线程都将暂停下来,等待数据库返回查询结果之后才能继续执行后面的代码。这是I/O型阻塞 node.js中在执行了访问数据库的代码之后将立即执行其后面的代码段,把数据库返回的结果的处理代码放在回调函数...

weixin_30467087的博客 143

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Node.JS基础

介绍Node.js及其与浏览器中JavaScript的区别。讲解Node.js的事件驱动、非阻塞I/O模型。Node.js的适用场景和优势。Node.js的版本管理和环境搭建。

世间万物皆不如你 710

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

前端开发工程师必读书籍有哪些值得推荐?

作者:朱林 链接:https://www.zhihu.com/question/22591993/answer/89484703 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 JavaScript 入门 《JavaScript权威指南(第六版)》 ★★★★★ 淘宝前端团队翻译的,看译者列表都是一堆大神。这本书又叫犀牛书,号称javascri...

编程知识分享 2281

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Node 微服务构建指南(一)

微服务是构建可扩展、健壮和适应性强应用的流行架构风格。它们允许开发者将复杂系统分解为更小、独立且松散耦合的服务,这些服务通过定义良好的接口进行通信。微服务使交付更快、测试更容易,并在选择每个服务的技术方面提供了更大的灵活性。Node.js 是一个用于构建微服务的强大且多功能的平台。它提供了一个快速且轻量级的运行环境,丰富的库和框架集,以及一个充满活力和支持性的社区。Node.js 允许开发者使用 JavaScript 编写微服务,这是一种无处不在且表达力强的语言,可以在任何平台上运行。

龙哥盟 1246

第六章:Node.js 模块化

将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化其中拆分出的 每一个文件就是一个模块,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用编码时是按照模块一个一个编码的,整个项目就是一个模块化的项目。

weixin_49794837的博客 1023

Vue 和 Node 全栈 Web 开发(一)

JavaScript 已经成为当今和未来最重要的语言之一。在过去几年中,JavaScript 的崛起非常迅速,它已成为现代网络应用开发中的强大语言。MEVN 是除了 MEAN 和 MERN 之外,用于开发现代网络应用的一种技术栈。本书提供了一种逐步构建全栈网络应用程序的方法,使用 MEVN 技术栈,即 MongoDB、Express.js、Vue.js 和 Node.js。本书将提供 Node.js 和 MongoDB 的基本概念,接着是构建 Express.js 应用程序并实现 Vue.js。在这本书中,

龙哥盟 824

写给 Python 开发者的 JavaScript 实用指南(一)

在学习 Python 时,您通过学习 Python 的基础知识、其优雅和编程原则,迈出了软件工程职业生涯的第一步。在您职业生涯的下一个阶段,让我们学习如何将您的编程知识转移到 JavaScript 上,以处理前端任务,包括 UX/UI 工作、表单验证、前端动画等。您可能熟悉使用 Flask 渲染前端,但 JavaScript 将使您能够实时创建用户界面并对用户输入做出反应。我们将深入探讨两种语言之间的差异,不仅在语法层面上,还在语义层面上:为什么和何时我们使用 JavaScript 而不是 Python,它

龙哥盟 1478

了不起的Node.js读书笔记

了不起的Node.js读书笔记

hacke2' Blog 3266

Node 初学者指南(一)

Node.js 初学者指南》是一本旨在实现特定目标的书籍:在构建一个真实应用的同时,尽可能快地将你从零基础带到部署,并强化每一章的教训。Node.js 多年来一直是一种领先的技术,尽管有大量资源可供学习,但本书采取了独特的方法。你在这里获得的知识,即使你决定改变技术栈的部分内容,也将保持相关性。让我现在用一个例子来说明这一点。在整本书中,我们使用 MongoDB,一个非关系型数据库,来构建我们的项目。如果你更喜欢使用 PostgreSQL 等数据库,可能会想知道如何适应项目。

龙哥盟 830
上一篇: 【附录A—高级特性】《node.js开发指南》读书笔记
下一篇: 《node.js实战》第四章(4.1—4.3) 构建web程序
崔佳宇_
崔佳宇_ 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄10年 1万+粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值