В настоящее время я работаю над кодом разработчика MongoDB Javascript.
Что-то у меня в голове не укладывается:
У этого метода есть некоторые забавные дела, происходящие в аргументах здесь. Что означает {filters = null, page = 0, moviesPerPage = 20} = {}
? Чего вы добиваетесь, приравнивая его к пустому объекту?
static async getMovies({
filters = null,
page = 0,
moviesPerPage = 20,
} = {}) {
/// more code
...}
Вот вся функция для большего контекста, если он вам понадобится:
static async getMovies({
filters = null,
page = 0,
moviesPerPage = 20,
} = {}) {
let queryParams = {}
if (filters) {
if ("text" in filters) {
queryParams = this.textSearchQuery(filters["text"])
} else if ("cast" in filters) {
queryParams = this.castSearchQuery(filters["cast"])
} else if ("genre" in filters) {
queryParams = this.genreSearchQuery(filters["genre"])
}
}
let { query = {}, project = {}, sort = DEFAULT_SORT } = queryParams
let cursor
try {
cursor = await movies
.find(query)
.project(project)
.sort(sort)
} catch (e) {
console.error(`Unable to issue find command, ${e}`)
return { moviesList: [], totalNumMovies: 0 }
}
/**
Ticket: Paging
Before this method returns back to the API, use the "moviesPerPage" and
"page" arguments to decide the movies to display.
Paging can be implemented by using the skip() and limit() cursor methods.
*/
// TODO Ticket: Paging
// Use the cursor to only return the movies that belong on the current page
const displayCursor = cursor.limit(moviesPerPage)
try {
const moviesList = await displayCursor.toArray()
const totalNumMovies = page === 0 ? await movies.countDocuments(query) : 0
return { moviesList, totalNumMovies }
} catch (e) {
console.error(
`Unable to convert cursor to array or problem counting documents, ${e}`,
)
return { moviesList: [], totalNumMovies: 0 }
}
}
Это параметр по умолчанию. Это предотвращает выдачу методом ошибки, если параметр не указан.
function getMovies({
filters = null,
page = 0,
moviesPerPage = 20,
} = {}) {
console.info('getMovies', filters, page, moviesPerPage)
}
function getMovies2({
filters = null,
page = 0,
moviesPerPage = 20,
}) {
console.info('getMovies2', filters, page, moviesPerPage)
}
getMovies({})
getMovies()
getMovies2({})
getMovies2()
Да, это зависит. Вам пришлось бы вызывать его с пустым объектом самостоятельно, если бы вы хотели использовать свойства по умолчанию: getMovies({})
Ниже есть строчка: let { query = {}, project = {}, sort = DEFAULT_SORT } = queryParams
следует той же логике? Пусть этот объект будет пустым, если он не указан в queryParams
Да. Но это потенциально может привести к сбою, если queryParams
будет undefined
.
Это параметр функции по умолчанию.
Если нет никакого параметра, {}
будет значением по умолчанию для этого реквизита.
Это необходимо, потому что если какой-либо параметр не передан, значение становится undefined
.
В этом случае возникает ошибка, когда вы пытаетесь получить такие значения, как filters
и page
, из реквизита undefined
. так вроде бы использовали.
Разве выдача ошибки не является хорошей вещью? Я думаю, это будет зависеть от общего дизайна приложения.