很多天前已经翻译了一大半了,今天收收尾~

RESTful API With Node.js + MongoDB

Translated By 林凌灵  

翻译目的:练练手,同时了解别人的思维方式

原文地址:RESTful APIWith Node.js + MongoDB


12 Sep 2013

我是一名移动应用开发者,我需要某种后端服务用来频繁地处理用户数据到数据库中.当然,我可以使用后端即服务类的网站(Parse, Backendless, 等等…),(译者:国内比较出名的有Bmob).但自己解决总是更方便和实际的选择.

于是我决定去探索我完全未知的技术领域,那个现在非常流行,定位在容易让新人吸收,并且不需要过于深入了解和处理大型项目经验的项目.

本文将仔细介绍使用Node.js的Express.js框架结合操作MongoDB的Mongoose.js,来给移动APP来搭建一个rest api.对于访问限制,我们将使用 OAuth2orize 和 Passport.js 来实现 OAuth 2.0.

概要

1. Node.js + Express.js, 简洁的 web-server
2. 错误处理
3. RESTful API 要点,增删改查
4. MongoDB & Mongoose.js
5. 访问限制 — OAuth 2.0, Passport.js

1. Node.js + Express.js, 简洁的 web-server

Node.js 没有i/o 阻塞,这对于需要被多个客户端访问的API服务来说是非常棒的.express.js 是一个先进的,轻量级的框架,它能帮助我们快速专注地编写我们需要API.

那么让我们用单个文件server.js来创建一个项目吧~因为我们的项目依赖于Express.js,所以我们将先安装它.安装第三方模块我们将使用Node的包管理器(NPM),很简单.只要在你的项目根目录下:npm install 模块名 .

app.get('/api/articles', function(req, res) {res.send('This is not implemented now');
});app.post('/api/articles', function(req, res) {res.send('This is not implemented now');
});app.get('/api/articles/:id', function(req, res) {res.send('This is not implemented now');
});app.put('/api/articles/:id', function (req, res){res.send('This is not implemented now');    
});app.delete('/api/articles/:id', function (req, res){res.send('This is not implemented now');
});

测试 post/put/delete 我推荐大家使用一个封装了curl 的强大库httpie,我将给出使用这个工具发起请求的例子.

4. MongoDB & Mongoose.js

选择一个数据库,我再次被我渴望新事物的心引导:MongoDB - 最流行的 NoSQL 文档型数据库.Mongoose.js-一层封装,帮助我们更加舒适地创建函数式schema文档.

下载并安装mongodb,然后安装Mongoose : npm install mongoose.我将把数据库交互作为独立的模块放在libs/mongoose.js.

var mongoose    = require('mongoose');
var log         = require('./log')(module);mongoose.connect('mongodb://localhost/test1');
var db = mongoose.connection;db.on('error', function (err) {log.error('connection error:', err.message);
});
db.once('open', function callback () {log.info("Connected to DB!");
});var Schema = mongoose.Schema;// Schemas
var Images = new Schema({kind: {type: String,enum: ['thumbnail', 'detail'],required: true},url: { type: String, required: true }
});var Article = new Schema({title: { type: String, required: true },author: { type: String, required: true },description: { type: String, required: true },images: [Images],modified: { type: Date, default: Date.now }
});// validation
Article.path('title').validate(function (v) {return v.length > 5 && v.length < 70;
});var ArticleModel = mongoose.model('Article', Article);
module.exports.ArticleModel = ArticleModel;

在这个文件中,实现了数据库连接和对象模式定义.文章将包含图片对象.同时也实现了各种各样复杂的验证.

我将使用 nconf 模块 来储存数据库路径.同时,我们把服务器端口也移到这里.安装:npm i nconf .自定义封装将被放在 libs/config.js.

var nconf = require('nconf');nconf.argv().env().file({ file: './config.json' });module.exports = nconf;

All the settings will be stored in config.json at the project’s root.

{"port" : 1337,"mongoose": {"uri": "mongodb://localhost/test1"}
}

mongoose.js changes:


var config      = require('./config');mongoose.connect(config.get('mongoose:uri'));

server.js changes:

var config = require('./libs/config');app.listen(config.get('port'), function(){log.info('Express server listening on port ' + config.get('port'));
});

Let’s add CRUD actions in existing routes.

var ArticleModel    = require('./libs/mongoose').ArticleModel;app.get('/api/articles', function(req, res) {return ArticleModel.find(function (err, articles) {if (!err) {return res.send(articles);} else {res.statusCode = 500;log.error('Internal error(%d): %s',res.statusCode,err.message);return res.send({ error: 'Server error' });}});
});app.post('/api/articles', function(req, res) {var article= new ArticleModel({title: req.body.title,author: req.body.author,description: req.body.description,images: req.body.images});article.save(function (err) {if (!err) {log.info("article created");return res.send({ status: 'OK', article:article });} else {console.log(err);if(err.name == 'ValidationError') {res.statusCode = 400;res.send({ error: 'Validation error' });} else {res.statusCode = 500;res.send({ error: 'Server error' });}log.error('Internal error(%d): %s',res.statusCode,err.message);}});
});app.get('/api/articles/:id', function(req, res) {return ArticleModel.findById(req.params.id, function (err, article) {if(!article) {res.statusCode = 404;return res.send({ error: 'Not found' });}if (!err) {return res.send({ status: 'OK', article:article });} else {res.statusCode = 500;log.error('Internal error(%d): %s',res.statusCode,err.message);return res.send({ error: 'Server error' });}});
});app.put('/api/articles/:id', function (req, res){return ArticleModel.findById(req.params.id, function (err, article) {if(!article) {res.statusCode = 404;return res.send({ error: 'Not found' });}article.title = req.body.title;article.description = req.body.description;article.author = req.body.author;article.images = req.body.images;return article.save(function (err) {if (!err) {log.info("article updated");return res.send({ status: 'OK', article:article });} else {if(err.name == 'ValidationError') {res.statusCode = 400;res.send({ error: 'Validation error' });} else {res.statusCode = 500;res.send({ error: 'Server error' });}log.error('Internal error(%d): %s',res.statusCode,err.message);}});});
});app.delete('/api/articles/:id', function (req, res){return ArticleModel.findById(req.params.id, function (err, article) {if(!article) {res.statusCode = 404;return res.send({ error: 'Not found' });}return article.remove(function (err) {if (!err) {log.info("article removed");return res.send({ status: 'OK' });} else {res.statusCode = 500;log.error('Internal error(%d): %s',res.statusCode,err.message);return res.send({ error: 'Server error' });}});});
});

所以的操作都非常清晰了,感谢Mongoose 和 自解释模型.现在,在我们开始运行node.js 之前,我我们先运行mongodb 服务器:mongo-一个实用的客户端工具用于处理数据库.服务本身就是mongod自己.

使用httpie 发送请求的例子:

<code class="sh hljs" data-origin="" <pre><code="" post="" http:="" localhost:1337="" api="" articles="" title="TestArticle" author="John Doe" description="lorem ipsum dolar sit amet" images:="[{"kind":"thumbnail", "url":"http://habrahabr.ru/images/write-topic.png"}, {"kind":"detail", "url":"http://habrahabr.ru/images/write-topic.png"}]" "="" style="display: block;border: 1px solid rgb(204, 204, 204); white-space: pre; padding: 0.5em; margin: 0px;border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: break-all; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); padding: 0px 5px; margin: 0px 2px;font-size: 0.9em; font-family: Consolas, Inconsolata, Courier, monospace;display: block; overflow-x: auto; padding: 0.5em; background-color: rgb(253, 246, 227); color: rgb(101, 123, 131); background-position: initial initial; background-repeat: initial initial;">http POST http://localhost:1337/api/articles title=TestArticle author='John Doe' description='lorem ipsum dolar sit amet' images:='[{"kind":"thumbnail", "url":"http://habrahabr.ru/images/write-topic.png"}, {"kind":"detail", "url":"http://habrahabr.ru/images/write-topic.png"}]'http http://localhost:1337/api/articleshttp http://localhost:1337/api/articles/52306b6a0df1064e9d000003http PUT http://localhost:1337/api/articles/52306b6a0df1064e9d000003 title=TestArticle2 author='John Doe' description='lorem ipsum dolar sit amet' images:='[{"kind":"thumbnail", "url":"http://habrahabr.ru/images/write-topic.png"}, {"kind":"detail", "url":"http://habrahabr.ru/images/write-topic.png"}]'http DELETE http://localhost:1337/api/articles/52306b6a0df1064e9d000003

这个阶段,你可以从github检出本项目

5. 访问控制 — OAuth 2.0, Passport.js

我们将使用 OAuth2. 或许这是多余的,但在将来这种方法将促进与其他授权方法的集成.

Passport.js 模块将负责访问控制.对于OAuth2 服务器,我将使用与其同一个作者的 OAuth2orize ,访问令牌将被储存在MongoDB中.

首先你需要安装下面全部的模块:
Faker
oauth2orize
passport
passport-http
passport-http-bearer
passport-oauth2-client-password

然后,你需要加入 mongoose.js 这个schema 给 users 和 tokens:

var crypto = require('crypto');// User
var User = new Schema({username: {type: String,unique: true,required: true},hashedPassword: {type: String,required: true},salt: {type: String,required: true},created: {type: Date,default: Date.now}
});User.methods.encryptPassword = function(password) {return crypto.createHmac('sha1', this.salt).update(password).digest('hex');//more secure – return crypto.pbkdf2Sync(password, this.salt, 10000, 512);
};User.virtual('userId').get(function () {return this.id;});User.virtual('password').set(function(password) {this._plainPassword = password;this.salt = crypto.randomBytes(32).toString('base64');//more secure - this.salt = crypto.randomBytes(128).toString('base64');this.hashedPassword = this.encryptPassword(password);}).get(function() { return this._plainPassword; });User.methods.checkPassword = function(password) {return this.encryptPassword(password) === this.hashedPassword;
};var UserModel = mongoose.model('User', User);// Client
var Client = new Schema({name: {type: String,unique: true,required: true},clientId: {type: String,unique: true,required: true},clientSecret: {type: String,required: true}
});var ClientModel = mongoose.model('Client', Client);// AccessToken
var AccessToken = new Schema({userId: {type: String,required: true},clientId: {type: String,required: true},token: {type: String,unique: true,required: true},created: {type: Date,default: Date.now}
});var AccessTokenModel = mongoose.model('AccessToken', AccessToken);// RefreshToken
var RefreshToken = new Schema({userId: {type: String,required: true},clientId: {type: String,required: true},token: {type: String,unique: true,required: true},created: {type: Date,default: Date.now}
});var RefreshTokenModel = mongoose.model('RefreshToken', RefreshToken);module.exports.UserModel = UserModel;
module.exports.ClientModel = ClientModel;
module.exports.AccessTokenModel = AccessTokenModel;
module.exports.RefreshTokenModel = RefreshTokenModel;

password虚拟属性举例了mongoose如何方便地在模型中嵌入逻辑.哈希算法和加盐(译者:加密加盐都是为了保护数据)不在本文的讨论范围,它的具体实现这里就不说了.

数据库对象:

User –一个用户有name,password以及相应的盐.
Client – 一个代表用户做出请求的客户端,需要具有name和secretcode.
AccessToken – token (即不记名类型), 颁发给客户端应用的, 具有时间限制(译者:就像cookie里的sessionid).
RefreshToken –另一种类型的token,允许你重新获得一个不记名的token而不需要通过密码获得.

在 config.json中配置token的生存时间:

{"port" : 1337,"security": {"tokenLife" : 3600},"mongoose": {"uri": "mongodb://localhost/testAPI"}
}

我在独立的模块中实现了OAuth2 服务器 以及认证逻辑.在auth.js 和passport.js 中策略已经写好了.我们载入3个策略—两个是用于OAuth2的username-password流的,一个是用于检查token的.

var config                  = require('./config');
var passport                = require('passport');
var BasicStrategy           = require('passport-http').BasicStrategy;
var ClientPasswordStrategy  = require('passport-oauth2-client-password').Strategy;
var BearerStrategy          = require('passport-http-bearer').Strategy;
var UserModel               = require('./mongoose').UserModel;
var ClientModel             = require('./mongoose').ClientModel;
var AccessTokenModel        = require('./mongoose').AccessTokenModel;
var RefreshTokenModel       = require('./mongoose').RefreshTokenModel;passport.use(new BasicStrategy(function(username, password, done) {ClientModel.findOne({ clientId: username }, function(err, client) {if (err) { return done(err); }if (!client) { return done(null, false); }if (client.clientSecret != password) { return done(null, false); }return done(null, client);});}
));passport.use(new ClientPasswordStrategy(function(clientId, clientSecret, done) {ClientModel.findOne({ clientId: clientId }, function(err, client) {if (err) { return done(err); }if (!client) { return done(null, false); }if (client.clientSecret != clientSecret) { return done(null, false); }return done(null, client);});}
));passport.use(newBearerStrategy(function(accessToken, done) {AccessTokenModel.findOne({ token: accessToken }, function(err, token) {if (err) { return done(err); }if (!token) { return done(null, false); }if( Math.round((Date.now()-token.created)/1000) > config.get('security:tokenLife') ) {AccessTokenModel.remove({ token: accessToken }, function (err) {if (err) return done(err);});return done(null, false, { message: 'Token expired' });}UserModel.findById(token.userId, function(err, user) {if (err) { return done(err); }if (!user) { return done(null, false, { message: 'Unknown user' }); }var info = { scope: '*' }done(null, user, info);});});}
));

oauth2.js is responsible for the issuance and renewal of the token. One token exchange strategy is for username-password flow, another is to refresh tokens.

oauth2.js 负责颁发和更新token.其中一个token交互策略是给username-password 流的,另一个是用于刷新token的.

var oauth2orize         = require('oauth2orize');
var passport            = require('passport');
var crypto              = require('crypto');
var config              = require('./config');
var UserModel           = require('./mongoose').UserModel;
var ClientModel         = require('./mongoose').ClientModel;
var AccessTokenModel    = require('./mongoose').AccessTokenModel;
var RefreshTokenModel   = require('./mongoose').RefreshTokenModel;// create OAuth 2.0 server
var server = oauth2orize.createServer();// Exchange username & password for access token.
server.exchange(oauth2orize.exchange.password(function(client, username, password, scope, done) {UserModel.findOne({ username: username }, function(err, user) {if (err) { return done(err); }if (!user) { return done(null, false); }if (!user.checkPassword(password)) { return done(null, false); }RefreshTokenModel.remove({ userId: user.userId, clientId: client.clientId }, function (err) {if (err) return done(err);});AccessTokenModel.remove({ userId: user.userId, clientId: client.clientId }, function (err) {if (err) return done(err);});var tokenValue = crypto.randomBytes(32).toString('base64');var refreshTokenValue = crypto.randomBytes(32).toString('base64');var token = new AccessTokenModel({ token: tokenValue, clientId: client.clientId, userId: user.userId });var refreshToken = new RefreshTokenModel({ token: refreshTokenValue, clientId: client.clientId, userId: user.userId });refreshToken.save(function (err) {if (err) { return done(err); }});var info = { scope: '*' }token.save(function (err, token) {if (err) { return done(err); }done(null, tokenValue, refreshTokenValue, { 'expires_in': config.get('security:tokenLife') });});});
}));// Exchange refreshToken for access token.
server.exchange(oauth2orize.exchange.refreshToken(function(client, refreshToken, scope, done) {RefreshTokenModel.findOne({ token: refreshToken }, function(err, token) {if (err) { return done(err); }if (!token) { return done(null, false); }if (!token) { return done(null, false); }UserModel.findById(token.userId, function(err, user) {if (err) { return done(err); }if (!user) { return done(null, false); }RefreshTokenModel.remove({ userId: user.userId, clientId: client.clientId }, function (err) {if (err) return done(err);});AccessTokenModel.remove({ userId: user.userId, clientId: client.clientId }, function (err) {if (err) return done(err);});var tokenValue = crypto.randomBytes(32).toString('base64');var refreshTokenValue = crypto.randomBytes(32).toString('base64');var token = new AccessTokenModel({ token: tokenValue, clientId: client.clientId, userId: user.userId });var refreshToken = new RefreshTokenModel({ token: refreshTokenValue, clientId: client.clientId, userId: user.userId });refreshToken.save(function (err) {if (err) { return done(err); }});var info = { scope: '*' }token.save(function (err, token) {if (err) { return done(err); }done(null, tokenValue, refreshTokenValue, { 'expires_in': config.get('security:tokenLife') });});});});
}));// token endpoint
exports.token = [passport.authenticate(['basic', 'oauth2-client-password'], { session: false }),server.token(),server.errorHandler()
]

在server.js加载这个模块:

var oauth2 = require('./libs/oauth2');app.use(passport.initialize());require('./libs/auth');app.post('/oauth/token', oauth2.token);app.get('/api/userInfo',passport.authenticate('bearer', { session: false }),function(req, res) {// req.authInfo is set using the `info` argument supplied by// `BearerStrategy`.  It is typically used to indicate scope of the token,// and used in access control checks.  For illustrative purposes, this// example simply returns the scope in the response.res.json({ user_id: req.user.userId, name: req.user.username, scope: req.authInfo.scope })}
);

例如,限制访问localhost:1337/api/userInfo.

To check the auth logic we should create a user and a client in our database. Use this node application, which will create the necessary objects and remove redundant from collections. It helpsquickly clean the tokens and users for testing.

这个检查逻辑,我们需要在数据库创建一个user和client.我们将使用node程序来创建必要的对象和移除冗余的集合.这可以帮助我们在测试时迅速地清空token

var log                 = require('./libs/log')(module);
var mongoose            = require('./libs/mongoose').mongoose;
var UserModel           = require('./libs/mongoose').UserModel;
var ClientModel         = require('./libs/mongoose').ClientModel;
var AccessTokenModel    = require('./libs/mongoose').AccessTokenModel;
var RefreshTokenModel   = require('./libs/mongoose').RefreshTokenModel;
var faker               = require('Faker');UserModel.remove({}, function(err) {var user = new UserModel({ username: "andrey", password: "simplepassword" });user.save(function(err, user) {if(err) return log.error(err);else log.info("New user - %s:%s",user.username,user.password);});for(i=0; i<4; i++) {var user = new UserModel({ username: faker.random.first_name().toLowerCase(), password: faker.Lorem.words(1)[0] });user.save(function(err, user) {if(err) return log.error(err);else log.info("New user - %s:%s",user.username,user.password);});}
});ClientModel.remove({}, function(err) {var client = new ClientModel({ name: "OurService iOS client v1", clientId: "mobileV1", clientSecret:"abc123456" });client.save(function(err, client) {if(err) return log.error(err);else log.info("New client - %s:%s",client.clientId,client.clientSecret);});
});
AccessTokenModel.remove({}, function (err) {if (err) return log.error(err);
});
RefreshTokenModel.remove({}, function (err) {if (err) return log.error(err);
});setTimeout(function() {mongoose.disconnect();
}, 3000);

如果你使用dataGgen.js,用一下命令测试授权将适合你.这里我们再次看看httpie的使用.

http POST http://localhost:1337/oauth/token grant_type=password client_id=mobileV1 client_secret=abc123456 username=andrey password=simplepasswordhttp POST http://localhost:1337/oauth/token grant_type=refresh_token client_id=mobileV1 client_secret=abc123456 refresh_token=TOKENhttp http://localhost:1337/api/userinfo Authorization:'Bearer TOKEN'

注意!在生产环境尽量使用HTTPS,这是OAuth2的隐含内容.还有,不要不忘记对密码进行正确的哈希处理.重申一下,你可在github找到这个项目.

开启本例前,你要先运行 npm install在你项目的根目录,然后运行mongod,node dataGen.js (等待它完成),然后运行node server.js.

如果有哪个部分有需要更清楚地描述,请给我留言.

总而言之,我想说node.js是一个伟大的、方便的服务器解决方案。MongoDB面向文档的方法是一个很不同寻常的但又确实是一个有用的工具。它还有很多功能我还不习惯。nodejs有一个很大的社区,有很多开源项目。例如,oauth2orize和password.js就是Jared Hanson带来精彩的项目,这很好地促进了项目的实现。


Evgeny Aleksandrov
iOS developer
evgeny@aleksandrov.ws

github.com/ealeksandrov
twitter.com/ealeksandrov

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. node.js通过权限验证连接MongoDB

    2017年1月,大部分mongodb由于配置的疏忽给了黑客可乘之机,于是便发生了一系列的杯具。所谓的配置疏忽其实就是mongdb所有者没有为mongodb开启权限认证,导致数据库“在任何网络环境,不使用账号直接登录”。这件事情告诉我们——做人不能太懒,虽然有时密码设置了和没设置一样…...

    2024/4/30 20:12:13
  2. Node.js+websocket+mongodb实现即时聊天室

    nodejs简介:Node.js是一个可以让javascript运行在服务器端的平台,它可以让javascript脱离浏览器的束缚运行在一般的服务器下面,你可以用Node.js轻松地进行服务器端应用的开发。Node.js是一个为实时Web应用开发而诞生的平台,它充分考虑了在实时响应和超大规模数据下架构的可…...

    2024/4/24 13:33:05
  3. 慕课网前端项目:Vue2.0+Node.js+MongoDB全栈打造商城系统 笔记 整理【1/18】

    第1章 1.1导学.wmv 1.2前端框架回顾.wmv 1.3vue概括核心思想.wmv 1.4vue的优点对比.wmv 第2章 2-1 nodejs和npm的安装和环境搭建.wmv 2-2 vue环境搭建以及vue-cli使用.wmv 2-3 vue配置(上).wmv 2-4 vue配置(下).wmv 第3章 2-5 vue…...

    2024/4/30 18:06:47
  4. Node.js + MongoDB学习

    昨天下午学习了一下搭建Node.js服务器访问MongoDB。 首先介绍一下Node.js其实只是使用chrome的JS引擎运行JS而已,换句话说,他就只是个运行JS的环境,使用node xx.js命令即可本地执行js。如果要搭建服务器则要使用里面的库。node.js使用的单线程异步IO,不过我对这个的优缺点还…...

    2024/4/30 18:33:44
  5. Node.js- MongoDB操作-集合操作

    7. 集合操作(1)创建集合Db.createCollection(‘collName’,options);options是对象,指定集合特性,可以省略(2)查看帮助Db.collName.help(); --db.collName是对象,查看该对象下的方法(3)集合状态db.printCollectionStats(); --数据库下所有集合的状态Db.collName.sta…...

    2024/4/24 13:33:02
  6. 总结:Node.js+MongoDB+AngularJS Web 开发--第十四章 从 Node.js 操作 MongoDB 文档

    第十四章 从 Node.js 操作 MongoDB 文档在上一章,我们学会了使用 MongoDB Node.js 驱动程序来管理和操作数据库和集合的基础知识。本章扩展了这些概念,说明如何在集合中操作文档。如上一章所述,MongoDB Node.js 驱动程序在 Collection 类中提供了很多功能,它允许你往集合…...

    2024/4/30 17:22:03
  7. node.js操作MongoDB

    node.js操作MongoDB时,需要安装mongodb包 1、使用npm安装cnpmnpm install -g cnpm --registry=https://registry.npm.taobao.org2、使用cnpm安装mongodb包cnpm install mongodbnode.js操作MongoDB时的四种方式:插入数据、更新数据、删除数据、查找数据。操作步骤 步骤1 创建…...

    2024/4/30 16:48:09
  8. Node.js学习-Node.js入门-08MongoDB

    关系型数据库关系型数据库需要通过sql操作 需要设计表结构 需要支持约束唯一 主键 默认值 非空非关系型数据库灵活 可以是key-value对 MongoDB很像关系型数据库数据库 集合 文档对象不需要设计表结构开启 # cmd # 默认执行mongod命令所处盘符根目录下的/data/db作为自己的数据存…...

    2024/4/30 17:36:25
  9. 2018最新nodejs+mongodb项目实战

    ----------------------课程目录------------------------------[Node.js+MongoDB]Mongodb教学视频[Node.js+MongoDB]Node.JS全栈工程师系列课程[Node.js+MongoDB]nodejs基础班NodeJs视频[Node.js+MongoDB]nodejs就业班NodeJs视频[Node.js+MongoDB]nodejs项目实战[Node.js+Mong…...

    2024/4/15 3:54:11
  10. Node.js、express、mongodb 实现分页查询、条件搜索

    前言在上一篇Node.js、express、mongodb 入门(基于easyui datagrid增删改查) 的基础上实现了分页查询、带条件搜索。实现效果 1、列表第一页。2、列表第二页3、条件搜索分页实现1、分页实现使用了Mongodb的query.skip().limit().where() 这三个方法,然后利用query.exec()。2、…...

    2024/4/26 1:28:32
  11. Node.js 连接 MongoDB 封装模块

    文章目录1. 安装mongoDB2. 创建数据库3 .数据操作查询数据find 排序数据sort插入数据更新数据删除数据查询分页4 . 封装 数据操作 模块 1. 安装mongoDB cnpm install --save-dev mongodb 2. 创建数据库 创建链接池 > 选择数据库 > 创建集合 // 引入mongodb驱动 var Mong…...

    2024/4/15 3:54:09
  12. 【备忘】vue2.0+node.js+MongoDB全栈打造商城(新录制)

    百度网盘第01章课程介绍 第02章vue基础 第03章Vue-router 第04章Vue-resource和Axios 第05章ES6常用语法 第06章商品列表模块实现 第07章Node 第08章MongoDB介绍 第09章基于node.js开发商品列表接口 第10章 登录模块实现 第11章购物车模块实现 第12章地址模块实现 第13章 订单确…...

    2024/4/16 13:19:33
  13. node.js解决MongoDB有时差的问题8小时

    简单 先安装模板moment然后引入var moment = require(moment) moment.locale(zh-cn) var today = moment().format(YYYY-MM-DD +H:MM);格式化 官网有很多种然后日期改成String拿到正确的值了...

    2024/4/26 15:24:08
  14. Node.js笔记(七)读取mongoDB的数据并显示

    虽然以前接触了mysql的内容,但做网站的时候,感觉NoSQL数据库还是绕不过去。 很多书籍上都提到了node.js和MongoDB的配合使用,这里记录一下学习过程。MongoDB的基本命令:use dbname 新建或者使用现有数据库 show dbs 显示所有数据库 show collections 显示所有collection(…...

    2024/4/25 0:11:57
  15. Node.js连接MongoDB。

    NoSQL的代表MongoDB最近大受欢迎,虽然还有一些功能没有完善,但是并不影响它的大火。 Node.js是使用JavaScript 编写的可以运行在服务端的JS语言。 那么,二者碰撞会产生什么样的火花呢。 今天,我就以一个简单的例子介绍一下(在本地新建数据库文件并将其内容显示到浏览器窗体…...

    2024/4/29 12:19:17
  16. node.js mongoDB express 在阿里云ubuntu上部署项目

    作为一个前端开发工程师,成为全栈工程师是我的一个短期目标,那么部署项目成为全栈工程师路上的最后一公里,这边自己写了一个工程(工程名叫zhuanshi),然后部署到服务器上。 参考文档:https://www.jianshu.com/p/be9f00e292a1 之前自己安装了node.js的环境,由于之前是静态…...

    2024/4/24 13:32:59
  17. Vue+Node.js+Mongodb 实现身份验证(token的使用和说明)

    一、首先了解一哈token的作用1.1、token是什么,为什么需要,怎样使用,参考这里哈是什么: token是交互会话中唯一身份标识符的令牌,即当前用户的唯一标识,并且可以设置有效时间为什么使用: 此项目用来作身份验证,保证用户是合法请求服务端数据。怎样使用:token值在用户第…...

    2024/4/24 13:32:57
  18. Get全栈技能点 Vue2.0/Node.js/MongoDB 打造商城系统

    第1章 课程介绍简单回顾前端近几年的框架模式,了解不同时期下的框架特点。其次介绍Vue框架的背景和核心思想,以及同其它MV*框架的对比。1-1 课程-导学1-2 前端框架回顾1-3 vue概况以及核心思想1-4 vue框架优缺点对比第2章 Vue基础从0到1,如何搭建一个简单的Vue项目;本章节主…...

    2024/4/24 13:32:56
  19. 基于node.js+mongodb的加密登录注册及后台管理系统

    一、技术选择Node.js Mongodb express md5 Bootstrap session https://www.npmjs.com/ 相关插件的用法可以在上面这个网站搜索二、登录实现思路: 1. 进入登陆页面并用session保存登录状态 2. 点击登录按钮并利用POST方法提交 3. 提交的数据传给后台与数据库取出的数据进行匹配…...

    2024/4/24 13:32:55
  20. Node.js- MongoDB操作-文档删除

    10. 删除文档(1)方法Db.collName.deleteOne()Db.collName.deleteMany()Db.collName.remove() (2)语法db.collName.remove(<query>,{justOne: <boolean>,writeConcern: <document>} )Query:(可选)删除的文档的条件JustOne:(可选)默认false,如果设为…...

    2024/4/24 13:32:57

最新文章

  1. 【深度学习基础(1)】什么是深度学习,深度学习与机器学习的区别、深度学习基本原理,深度学习的进展和未来

    文章目录 一. 深度学习概念二. 深度学习与机器学习的区别三. 理解深度学习的工作原理1. 每层的转换进行权重参数化2. 怎么衡量神经网络的质量3. 怎么减小损失值 四. 深度学习已取得的进展五. 人工智能的未来 - 不要太过焦虑跟不上 一. 深度学习概念 先放一张图来理解下人工智能…...

    2024/5/1 0:04:19
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 磁盘管理与文件管理

    文章目录 一、磁盘结构二、MBR与磁盘分区分区的优势与缺点分区的方式文件系统分区工具挂载与解挂载 一、磁盘结构 1.硬盘结构 硬盘分类&#xff1a; 1.机械硬盘&#xff1a;靠磁头转动找数据 慢 便宜 2.固态硬盘&#xff1a;靠芯片去找数据 快 贵 硬盘的数据结构&#xff1a;…...

    2024/4/29 19:39:50
  4. Linux从入门到精通 --- 2.基本命令入门

    文章目录 第二章&#xff1a;2.1 Linux的目录结构2.1.1 路径描述方式 2.2 Linux命令入门2.2.1 Linux命令基础格式2.2.2 ls命令2.2.3 ls命令的参数和选项2.2.4 ls命令选项的组合使用 2.3 目录切换相关命令2.3.1 cd切换工作目录2.3.2 pwd查看当前工作目录2.4 相对路径、绝对路径和…...

    2024/4/30 5:12:27
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57