Javascript 编写关键nodejs后端函数的最佳方法是什么?

Javascript 编写关键nodejs后端函数的最佳方法是什么?,javascript,node.js,Javascript,Node.js,我想为重复任务编写函数。例如,我想要一个文件lib/dbFunctions来处理数据库中的任何内容,比如在数据库中搜索特定用户。 所以我只想创建函数searchUser(username)并导入我的函数,例如const dbFunctions=require('lib/dbFunctions),这样我就可以调用dbFunctions.searchUser(“ExampleUser”) 我如何在NodeJS中解决这个问题 我只发现使用express.Router()的示例如下所示: const e

我想为重复任务编写函数。例如,我想要一个文件lib/dbFunctions来处理数据库中的任何内容,比如在数据库中搜索特定用户。 所以我只想创建函数searchUser(username)并导入我的函数,例如
const dbFunctions=require('lib/dbFunctions
),这样我就可以调用
dbFunctions.searchUser(“ExampleUser”)

我如何在NodeJS中解决这个问题

我只发现使用
express.Router()
的示例如下所示:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);

然而,我不知怎么搞不懂如何编写一个带有函数的完全自定义类

听起来你只需要知道如何制作一个模块

假设您有一个
index.js
,如下所示:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);
您可以通过在
/lib/dbFunctions.js
中创建一个如下所示的文件来使模块正常工作:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);
现在,如果运行
node index.js
,您将在控制台中看到
found user Dan
print

需要注意的是,当您导入模块时,node希望
lib/dbFunctions
这样的路径存在于
node\u模块
中,而当您尝试在项目中导入本地模块时,您需要指定导入的相对路径,因此我在我的示例中使用了
/lib/dbFunctions
例如

在项目中创建自定义库的另一种常见方法是使用称为桶文件或桶导出的模式

您可以在
/lib/dbFunctions
创建一个目录,而不是名为
dbFunctions.js的文件,该目录的根目录中有一个
index.js
。然后,您可以将所有函数分离到它们自己的模块中,例如:

// /lib/dbFunctions/searchUser.js
const searchUser = (name) => `found user ${name}`

module.exports = searchUser

// /lib/dbFunctions/searchPost.js
const searchPost = (id) => `found post ${id}`

module.exports = searchPost
然后您的
index.js
文件将如下所示:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);
然后是您的主要入口点(
index.js


听起来你只需要知道如何制作一个模块

假设您有一个
index.js
,如下所示:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);
您可以通过在
/lib/dbFunctions.js
中创建一个如下所示的文件来使模块正常工作:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);
现在,如果运行
node index.js
,您将在控制台中看到
found user Dan
print

需要注意的是,当您导入模块时,node希望
lib/dbFunctions
这样的路径存在于
node\u模块
中,而当您尝试在项目中导入本地模块时,您需要指定导入的相对路径,因此我在我的示例中使用了
/lib/dbFunctions
例如

在项目中创建自定义库的另一种常见方法是使用称为桶文件或桶导出的模式

您可以在
/lib/dbFunctions
创建一个目录,而不是名为
dbFunctions.js的文件,该目录的根目录中有一个
index.js
。然后,您可以将所有函数分离到它们自己的模块中,例如:

// /lib/dbFunctions/searchUser.js
const searchUser = (name) => `found user ${name}`

module.exports = searchUser

// /lib/dbFunctions/searchPost.js
const searchPost = (id) => `found post ${id}`

module.exports = searchPost
然后您的
index.js
文件将如下所示:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);
然后是您的主要入口点(
index.js


似乎您想要创建一个由一系列函数组成的模块。如果是这种情况,典型的函数模块如下所示:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);
//文件customFunctions.js
函数custom1(){…}
函数custom2(){…}
...
module.exports={custom1,custom2,…}
模块将包含函数的对象导出为属性

然后,只需在需要文件的地方要求该文件:

const customFns = require('./customFunctions');

customFns.custom1();

似乎您想要创建一个由一系列函数组成的模块。如果是这种情况,典型的函数模块如下所示:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);
//文件customFunctions.js
函数custom1(){…}
函数custom2(){…}
...
module.exports={custom1,custom2,…}
模块将包含函数的对象导出为属性

然后,只需在需要文件的地方要求该文件:

const customFns = require('./customFunctions');

customFns.custom1();

我通常通过创建一个类来做这类事情,比如
UserRepository

class UserRepository() {
  static searchUser(user){
    // your logic here
  }

  static getUserByEmail(email){
    // your logic here
  }
}

module.exports = UserRepository;
您可以从以下任何位置调用此函数:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);
上述方法的优点是,您可以在构造函数中处理与数据库对话之前所需的其他逻辑。这基本上是基于面向对象的方法

另一种方法是(不基于OOP):

您可以使用相同的方式:

const UserRepository = require('./user-repository.js');
UserRepository.search(user);

我通常通过创建一个类来做这类事情,比如
UserRepository

class UserRepository() {
  static searchUser(user){
    // your logic here
  }

  static getUserByEmail(email){
    // your logic here
  }
}

module.exports = UserRepository;
您可以从以下任何位置调用此函数:

const express = require('express');
const customRoutes = express.Router();
cusrtomRoutes.get('/login',function(req,res){
    res.render('account/login');
});
module.exports = {"CustomRoutes" : customRoutes};
const dbFunctions = require('./lib/dbFunctions')

console.log(dbFunctions.searchUser('Dan'))
const searchUser = (name) => `found user ${name}`

module.exports = {searchUser}
// /lib/dbFunctions/index.js
const searchUser = require('./searchUser');
const searchPost = require('./searchPost');

module.exports = {
    searchUser,
    searchPost
}
const UserRepository = require('./user-repository.js');
UserRepository.searchUser(user);
上述方法的优点是,您可以在构造函数中处理与数据库对话之前所需的其他逻辑。这基本上是基于面向对象的方法

另一种方法是(不基于OOP):

您可以使用相同的方式:

const UserRepository = require('./user-repository.js');
UserRepository.search(user);

非常感谢。这似乎是最接近我正在搜索的内容(js必须提供)。你也知道我能做些什么来保持与数据库的连接吗?这个方法的问题似乎在于,我要么需要创建一个新的mysql.createConnection(),要么总是像“searchUser(name,con)”那样解析连接。不知何故,我希望我可以拥有自己的类,并保留一开始创建的连接。但这似乎不适用于模块(或者至少我没有发现任何方法)没问题,很高兴我能提供帮助:)这些天我大部分的服务器端开发都花在PHP上,但一般来说,我使用的ORM会为每个查询、插入或更新创建一个新的连接。通常,您使用的库将不再需要指定连接,这样您就不会在任何地方不断重复自己的操作。如果您尝试的是将域与数据库层解耦,那么您当然可以遵循存储库模式。听起来您可能不是来自JS背景,所以请注意,创建经典的OOP模式不需要类和接口(原生JS也没有接口)。